pandas
Pandas IO-Tools (Lesen und Speichern von Datensätzen)
Suche…
Bemerkungen
Die offizielle Dokumentation zu Pandas enthält eine Seite mit den IO Tools, die eine Liste relevanter Funktionen zum Lesen und Schreiben von Dateien sowie einige Beispiele und allgemeine Parameter enthält.
CSV-Datei in DataFrame lesen
Beispiel für das Lesen der Datei data_file.csv
wie:
Datei:
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')
Ausgabe:
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
Einige nützliche Argumente:
sep
Das Standard - Feldtrennzeichen ist ein Komma,
. Verwenden Sie diese Option, wenn Sie ein anderes Trennzeichen benötigen, beispielsweisepd.read_csv('data_file.csv', sep=';')
index_col
Mitindex_col = n
(n
eine ganze Zahl)index_col = n
Sie Pandas an, Spalten
zur Indexierung des DataFrame zu verwenden. Im obigen Beispiel:pd.read_csv('data_file.csv', index_col=0)
Ausgabe:
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
Standardmäßig werden leere Zeilen übersprungen. Verwenden Sieskip_blank_lines=False
, um leere Zeilenskip_blank_lines=False
(diese werden mitNaN
Werten gefüllt).pd.read_csv('data_file.csv', index_col=0,skip_blank_lines=False)
Ausgabe:
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
Verwenden Sie diese Option, umparse_dates
zu analysieren.Datei:
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 zum Analysieren der Spalten
0
und1
als Datumsangaben:pd.read_csv('f.csv', sep=';', parse_dates=[0,1])
Ausgabe:
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
Standardmäßig wird das Datumsformat abgeleitet. Wenn Sie ein Datumsformat angeben möchten, können Sie beispielsweise verwenden
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y') pd.read_csv('f.csv', sep=';',parse_dates=[0,1],date_parser=dateparse)
Ausgabe:
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
Weitere Informationen zu den Funktionsparametern finden Sie in der offiziellen Dokumentation .
Grundlegendes Speichern in eine CSV-Datei
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')
Analysieren von Datumsangaben beim Lesen aus csv
Sie können eine Spalte angeben, die Datumsangaben enthält, damit Pandas diese beim Lesen aus der CSV automatisch analysieren
pandas.read_csv('data_file.csv', parse_dates=['date_column'])
Tabelle zum Diktieren von DataFrames
with pd.ExcelFile('path_to_file.xls) as xl: d = {sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
Lesen Sie ein bestimmtes Blatt
pd.read_excel('path_to_file.xls', sheetname='Sheet1')
Es gibt viele read_excel
für read_excel
(ähnlich den Optionen in read_csv
.)
pd.read_excel('path_to_file.xls', sheetname='Sheet1', header=[0, 1, 2], skiprows=3, index_col=0) # etc.
Read_csv wird getestet
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
Listenverständnis
Alle Dateien sind im Ordner files
. Erstellen Sie zunächst eine Liste mit DataFrames und concat
diese:
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
Lesen Sie in Brocken
import pandas as pd
chunksize = [n]
for chunk in pd.read_csv(filename, chunksize=chunksize):
process(chunk)
delete(chunk)
In CSV-Datei speichern
Mit Standardparametern speichern:
df.to_csv(file_name)
Schreiben Sie bestimmte Spalten:
df.to_csv(file_name, columns =['col'])
Difault-Trennzeichen ist ',' - um es zu ändern:
df.to_csv(file_name,sep="|")
Schreibe ohne Kopfzeile:
df.to_csv(file_name, header=False)
Schreiben Sie mit einem gegebenen Header:
df.to_csv(file_name, header = ['A','B','C',...]
Verwenden Sie das Kodierungsargument, um eine bestimmte Kodierung (z. B. 'utf-8') zu verwenden:
df.to_csv (Dateiname, Kodierung = 'utf-8')
Analysieren von Datumsspalten mit read_csv
Datumsangaben haben immer ein anderes Format, sie können mit einer bestimmten parse_dates-Funktion analysiert werden.
Diese input.csv :
2016 06 10 20:30:00 foo 2016 07 11 19:45:30 bar 2013 10 12 4:30:00 foo
Kann so analysiert werden:
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)
Das Argument parse_dates ist die zu analysierende Spalte
date_parser ist die Parser-Funktion
Lesen und Zusammenführen mehrerer CSV-Dateien (mit derselben Struktur) in einem 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())
Wenn Sie CSV-Dateien horizontal zusammenführen möchten (Spalten hinzufügen), verwenden Sie axis=1
wenn Sie die Funktion pd.concat()
aufrufen:
def merged_csv_horizontally(flist, **kwargs):
return pd.concat([pd.read_csv(f, **kwargs) for f in flist], axis=1)
Lesen der cvs-Datei in einen Pandas-Datenrahmen, wenn keine Kopfzeile vorhanden ist
Wenn die Datei keine Kopfzeile enthält,
Datei:
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
Sie können die Schlüsselwortnamen names
, um Spaltennamen anzugeben:
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
Verwenden von HDFStore
import string
import numpy as np
import pandas as pd
Beispiel-DF mit verschiedenen D-Typen erzeugen
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
einen größeren DF erstellen (10 * 100.000 = 1.000.000 Zeilen)
df = pd.concat([df] * 10**5, ignore_index=True)
HDFStore-Datei erstellen (oder vorhandene öffnen)
store = pd.HDFStore('d:/temp/example.h5')
Speichern Sie unseren Datenrahmen in der h5
Datei (HDFStore) und indizieren Sie die Spalten [int32, int64, string]:
store.append('store_key', df, data_columns=['int32','int64','string'])
HDFStore-Details anzeigen
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}
Zeige indizierte Spalten
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}
Schließen Sie unsere Speicherdatei
store.close()
Nginx-Zugriffsprotokoll lesen (mehrere Anführungszeichen)
Verwenden Sie für mehrere Anführungszeichen regex anstelle von 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
)