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:
sep
De standaard veldbegrenzer is een komma,
. Gebruik deze optie als u een ander scheidingsteken nodig hebt, bijvoorbeeldpd.read_csv('data_file.csv', sep=';')
index_col
Metindex_col = n
(n
een geheel getal) vertelt u panda's om kolomn
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. Gebruikskip_blank_lines=False
om lege regels op te nemen (deze worden gevuld metNaN
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
en1
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
)