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:

  • sep De standaard veldbegrenzer is een komma , . Gebruik deze optie als u een ander scheidingsteken nodig hebt, bijvoorbeeld pd.read_csv('data_file.csv', sep=';')

  • index_col Met index_col = n ( n een geheel getal) vertelt u panda's om kolom n te 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_lines Standaard worden lege regels overgeslagen. Gebruik skip_blank_lines=False om lege regels op te nemen (deze worden gevuld met NaN waarden)

    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_dates Gebruik 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 0 en 1 als 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
                )


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow