Pandas Lesen csv-out of memory
Ich versuche, Sie zu manipulieren, eine große CSV-Datei mit den Pandas, wenn ich dies schrieb,
df = pd.read_csv(strFileName,sep='\t',delimiter='\t')
wirft er "pandas.parser.CParserError: Fehler tokenisierung von Daten. C error: out of memory"
wc -l gibt es 13822117 Zeilen, ich brauche die Summe auf das csv-Datei-Daten-frame, gibt es eine Möglichkeit, um dieses andere dann teilen Sie die csv-Datei auf mehrere Dateien und schreiben-codes Zusammenführen der Ergebnisse? Irgendwelche Vorschläge, wie das zu tun? Dank
Die Eingabe ist wie folgt:
columns=[ka,kb_1,kb_2,timeofEvent,timeInterval]
0:'3M' '2345' '2345' '2014-10-5',3000
1:'3M' '2958' '2152' '2015-3-22',5000
2:'GE' '2183' '2183' '2012-12-31',515
3:'3M' '2958' '2958' '2015-3-10',395
4:'GE' '2183' '2285' '2015-4-19',1925
5:'GE' '2598' '2598' '2015-3-17',1915
Und die gewünschte Ausgabe wie diese:
columns=[ka,kb,errorNum,errorRate,totalNum of records]
'3M','2345',0,0%,1
'3M','2958',1,50%,2
'GE','2183',1,50%,2
'GE','2598',0,0%,1
wenn der Datensatz klein ist, wird der folgende code verwendet werden könnte, wie es von der anderen
df2 = df.groupby(['ka','kb_1'])['isError'].agg({ 'errorNum': 'sum',
'recordNum': 'count' })
df2['errorRate'] = df2['errorNum'] / df2['recordNum']
ka kb_1 recordNum errorNum errorRate
3M 2345 1 0 0.0
2958 2 1 0.5
GE 2183 2 1 0.5
2598 1 0 0.0
(definition von Fehler Datensatz: wenn kb_1!=kb_2,wird der entsprechende Datensatz wird behandelt, als anormale Datensatz)
- Keine Notwendigkeit, geben Sie
delimiter
seitsep
ist bereits vorhanden. Auchpd.read_table()
übernimmtsep='\t'
, so konnte man nur aufrufen, dass anstelle derpd.read_csv()
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf Ihrem snippet in out of memory Fehler beim Einlesen der csv-Datei in chunks,
beim Lesen von Zeile zu Zeile.
Ich gehe davon aus, dass
kb_2
ist der Fehler-Indikator,Dieser code speichert alle Gruppen in einem Wörterbuch, und berechnet die Fehlerrate nach dem Lesen der gesamten Datei.
Begegnen einem out-of-memory-Ausnahme, wenn es zu viele Kombinationen von Gruppen.
Haben Sie nicht gesagt, was Ihr bestimmt aggregation wäre, aber wenn es nur sum und count, dann könnte man die aggregate in Brocken:
Was @chrisaycock vorgeschlagen, ist die bevorzugte Methode, wenn Sie brauchen, um die sum-oder count -
Wenn Sie brauchen, um Durchschnittliche, es wird nicht funktionieren, weil
avg(a,b,c,d)
nicht gleichavg(avg(a,b),avg(c,d))
Schlage ich vor, eine map-reduce wie Ansatz, mit streaming -
erstellen Sie eine Datei namens
map-col.py
Und eine Datei namens
reduce-avg.py
In und um der ganzen Sache:
Diese Methode funktioniert unabhängig von der Größe der Datei und wird nicht run out of memory