pandas                
            Pandas IO-tools (gegevenssets lezen en opslaan)
        
        
            
    Zoeken…
Opmerkingen
De officiële documentatie van de panda's bevat een pagina op IO Tools met een lijst met relevante functies om te lezen en naar bestanden te schrijven, evenals enkele voorbeelden en algemene parameters.
Csv-bestand lezen in DataFrame
 Voorbeeld voor het lezen van bestand data_file.csv zoals: 
Het dossier:
index,header1,header2,header3
1,str_data,12,1.4
3,str_data,22,42.33
4,str_data,2,3.44
2,str_data,43,43.34
7, str_data, 25, 23.32
Code:
pd.read_csv('data_file.csv')
Output:
   index    header1  header2  header3
0      1   str_data       12     1.40
1      3   str_data       22    42.33
2      4   str_data        2     3.44
3      2   str_data       43    43.34
4      7   str_data       25    23.32
Enkele nuttige argumenten:
- sepDe standaard veldbegrenzer is een komma- ,. Gebruik deze optie als u een ander scheidingsteken nodig hebt, bijvoorbeeld- pd.read_csv('data_file.csv', sep=';')
- index_colMet- index_col = n(- neen geheel getal) vertelt u panda's om kolom- nte gebruiken om het DataFrame te indexeren. In het bovenstaande voorbeeld:- pd.read_csv('data_file.csv', index_col=0)- Output: - header1 header2 header3 index 1 str_data 12 1.40 3 str_data 22 42.33 4 str_data 2 3.44 2 str_data 43 43.34 7 str_data 25 23.32
- skip_blank_linesStandaard worden lege regels overgeslagen. Gebruik- skip_blank_lines=Falseom lege regels op te nemen (deze worden gevuld met- NaNwaarden)- pd.read_csv('data_file.csv', index_col=0,skip_blank_lines=False)- Output: - header1 header2 header3 index 1 str_data 12 1.40 3 str_data 22 42.33 4 str_data 2 3.44 2 str_data 43 43.34 NaN NaN NaN NaN 7 str_data 25 23.32
- parse_datesGebruik deze optie om datumgegevens te parseren.- Het dossier: - date_begin;date_end;header3;header4;header5 1/1/2017;1/10/2017;str_data;1001;123,45 2/1/2017;2/10/2017;str_data;1001;67,89 3/1/2017;3/10/2017;str_data;1001;0- Code om kolommen - 0en- 1als datums te parseren:- pd.read_csv('f.csv', sep=';', parse_dates=[0,1])- Output: - date_begin date_end header3 header4 header5 0 2017-01-01 2017-01-10 str_data 1001 123,45 1 2017-02-01 2017-02-10 str_data 1001 67,89 2 2017-03-01 2017-03-10 str_data 1001 0- Standaard wordt de datumnotatie afgeleid. Als u een datumnotatie wilt opgeven die u bijvoorbeeld kunt gebruiken - dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y') pd.read_csv('f.csv', sep=';',parse_dates=[0,1],date_parser=dateparse)- Output: - date_begin date_end header3 header4 header5 0 2017-01-01 2017-10-01 str_data 1001 123,45 1 2017-01-02 2017-10-02 str_data 1001 67,89 2 2017-01-03 2017-10-03 str_data 1001 0
Meer informatie over de parameters van de functie is te vinden in de officiële documentatie .
Eenvoudig opslaan in een csv-bestand
raw_data = {'first_name': ['John', 'Jane', 'Jim'],
            'last_name': ['Doe', 'Smith', 'Jones'],
            'department': ['Accounting', 'Sales', 'Engineering'],}
df = pd.DataFrame(raw_data,columns=raw_data.keys())
df.to_csv('data_file.csv')
Gegevens parseren bij het lezen van csv
U kunt een kolom opgeven die datums bevat, zodat panda's deze automatisch zouden ontleden bij het lezen van de csv
pandas.read_csv('data_file.csv', parse_dates=['date_column'])
Spreadsheet naar dict van DataFrames
with pd.ExcelFile('path_to_file.xls) as xl:
    d = {sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
        Lees een specifiek blad
pd.read_excel('path_to_file.xls', sheetname='Sheet1')
  Er zijn veel parsing-opties voor read_excel (vergelijkbaar met de opties in read_csv . 
pd.read_excel('path_to_file.xls',
              sheetname='Sheet1', header=[0, 1, 2],
              skiprows=3, index_col=0)  # etc.
        Read_csv testen
import pandas as pd
import io
temp=u"""index; header1; header2; header3
1; str_data; 12; 1.4
3; str_data; 22; 42.33
4; str_data; 2; 3.44
2; str_data; 43; 43.34
7; str_data; 25; 23.32"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp),  
                 sep = ';', 
                 index_col = 0,
                 skip_blank_lines = True)
print (df)
         header1   header2   header3
index                               
1       str_data        12      1.40
3       str_data        22     42.33
4       str_data         2      3.44
2       str_data        43     43.34
7       str_data        25     23.32
Lijstbegrip
 Alle bestanden in de map files . Maak eerst de lijst van DataFrames en vervolgens concat hen: 
import pandas as pd
import glob
#a.csv
#a,b
#1,2
#5,8
#b.csv
#a,b
#9,6
#6,4
#c.csv
#a,b
#4,3
#7,0
files = glob.glob('files/*.csv')
dfs = [pd.read_csv(fp) for fp in files]
#duplicated index inherited from each Dataframe
df = pd.concat(dfs)
print (df)
   a  b
0  1  2
1  5  8
0  9  6
1  6  4
0  4  3
1  7  0
#'reseting' index
df = pd.concat(dfs, ignore_index=True)
print (df)
   a  b
0  1  2
1  5  8
2  9  6
3  6  4
4  4  3
5  7  0
#concat by columns
df1 = pd.concat(dfs, axis=1)
print (df1)
   a  b  a  b  a  b
0  1  2  9  6  4  3
1  5  8  6  4  7  0
#reset column names
df1 = pd.concat(dfs, axis=1, ignore_index=True)
print (df1)
   0  1  2  3  4  5
0  1  2  9  6  4  3
1  5  8  6  4  7  0
In stukken lezen
import pandas as pd    
chunksize = [n]
for chunk in pd.read_csv(filename, chunksize=chunksize):
    process(chunk)
    delete(chunk)
Opslaan in CSV-bestand
Opslaan met standaardparameters:
df.to_csv(file_name)
Schrijf specifieke kolommen:
df.to_csv(file_name, columns =['col'])
Difault-scheidingsteken is ',' - om het te wijzigen:
df.to_csv(file_name,sep="|")
Schrijf zonder kop:
df.to_csv(file_name, header=False)
Schrijf met een gegeven kop:
df.to_csv(file_name, header = ['A','B','C',...]
Om een specifieke codering te gebruiken (bijv. 'Utf-8') gebruikt u het coderingsargument:
df.to_csv (bestandsnaam, codering = 'utf-8')
Kolommen met datum parseren met read_csv
Datum hebben altijd een ander formaat, ze kunnen worden ontleed met een specifieke parse_dates-functie.
Deze input.csv :
2016 06 10 20:30:00 foo 2016 07 11 19:45:30 bar 2013 10 12 4:30:00 foo
Kan als volgt worden ontleed:
mydateparser = lambda x: pd.datetime.strptime(x, "%Y %m %d %H:%M:%S")
df = pd.read_csv("file.csv", sep='\t', names=['date_column', 'other_column'], parse_dates=['date_column'], date_parser=mydateparser)
 argument parse_dates is de kolom die moet worden ontleed 
 date_parser is de parserfunctie 
Lees en voeg meerdere CSV-bestanden (met dezelfde structuur) samen in één DF
import os
import glob
import pandas as pd
def get_merged_csv(flist, **kwargs):
    return pd.concat([pd.read_csv(f, **kwargs) for f in flist], ignore_index=True)
path = 'C:/Users/csvfiles'
fmask = os.path.join(path, '*mask*.csv')
df = get_merged_csv(glob.glob(fmask), index_col=None, usecols=['col1', 'col3'])
print(df.head())
 Als u CSV-bestanden horizontaal wilt samenvoegen (kolommen toevoegen), gebruikt u axis=1 bij het aanroepen van de functie pd.concat() : 
def merged_csv_horizontally(flist, **kwargs):
    return pd.concat([pd.read_csv(f, **kwargs) for f in flist], axis=1)
Cvs-bestand lezen in een pandas-gegevensframe als er geen koprij is
Als het bestand geen koprij bevat,
Het dossier:
1;str_data;12;1.4
3;str_data;22;42.33
4;str_data;2;3.44
2;str_data;43;43.34
7; str_data; 25; 23.32
 U kunt het zoekwoord names kolom namen te verstrekken: 
df = pandas.read_csv('data_file.csv', sep=';', index_col=0,
                     skip_blank_lines=True, names=['a', 'b', 'c'])
df
Out: 
           a   b      c
1   str_data  12   1.40
3   str_data  22  42.33
4   str_data   2   3.44
2   str_data  43  43.34
7   str_data  25  23.32
HDFStore gebruiken
import string
import numpy as np
import pandas as pd
genereren monster DF met verschillende dtypes
df = pd.DataFrame({
     'int32':    np.random.randint(0, 10**6, 10),
     'int64':    np.random.randint(10**7, 10**9, 10).astype(np.int64)*10,
     'float':    np.random.rand(10),
     'string':   np.random.choice([c*10 for c in string.ascii_uppercase], 10),
     })
In [71]: df
Out[71]:
      float   int32       int64      string
0  0.649978  848354  5269162190  DDDDDDDDDD
1  0.346963  490266  6897476700  OOOOOOOOOO
2  0.035069  756373  6711566750  ZZZZZZZZZZ
3  0.066692  957474  9085243570  FFFFFFFFFF
4  0.679182  665894  3750794810  MMMMMMMMMM
5  0.861914  630527  6567684430  TTTTTTTTTT
6  0.697691  825704  8005182860  FFFFFFFFFF
7  0.474501  942131  4099797720  QQQQQQQQQQ
8  0.645817  951055  8065980030  VVVVVVVVVV
9  0.083500  349709  7417288920  EEEEEEEEEE
maak een grotere DF (10 * 100.000 = 1.000.000 rijen)
df = pd.concat([df] * 10**5, ignore_index=True)
maak (of open een bestaand) HDFStore-bestand
store = pd.HDFStore('d:/temp/example.h5')
 sla ons gegevensframe op in het h5 bestand (HDFStore) en indexeer de kolommen [int32, int64, string]: 
store.append('store_key', df, data_columns=['int32','int64','string'])
details van de HDFStore weergeven
In [78]: store.get_storer('store_key').table
Out[78]:
/store_key/table (Table(10,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
  "int32": Int32Col(shape=(), dflt=0, pos=2),
  "int64": Int64Col(shape=(), dflt=0, pos=3),
  "string": StringCol(itemsize=10, shape=(), dflt=b'', pos=4)}
  byteorder := 'little'
  chunkshape := (1724,)
  autoindex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "int32": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "string": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "int64": Index(6, medium, shuffle, zlib(1)).is_csi=False}
geïndexeerde kolommen weergeven
In [80]: store.get_storer('store_key').table.colindexes
Out[80]:
{
    "int32": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "string": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "int64": Index(6, medium, shuffle, zlib(1)).is_csi=False}
sluit (naar schijf) ons winkelbestand
store.close()
Nginx toegangslog lezen (meerdere quotechars)
Gebruik regex voor meerdere quotechars in plaats van sep:
df = pd.read_csv(log_file,
              sep=r'\s(?=(?:[^"]*"[^"]*")*[^"]*$)(?![^\[]*\])',
              engine='python',
              usecols=[0, 3, 4, 5, 6, 7, 8],
              names=['ip', 'time', 'request', 'status', 'size', 'referer', 'user_agent'],
              na_values='-',
              header=None
                )