2016-07-29 4 views
2

Ich versuche, einige Pandas Dataframe, die ich aus einer Reihe von CSV-Dateien zu lesen, und nach der 16. Datei oder so bekomme ich einen Speicherfehler. Die neuen Dateien sind Pandas mit etwa 300.000 Zeilen.Pandas Dataframe iterativ auf effiziente Weise hinzufügen

Gibt es eine Möglichkeit, dies auf der Festplatte (z. B. mit hdf5) oder auf eine speicher effizientere Weise zu tun?

Siehe Code unten. Beachten Sie, dass sum_of_all_files als leerer Datenrahmen beginnt.

sum_of_all_files = pd.DataFrame() 
for file_name in list_of_files: 
    file_df=pd.read_csv(file_name,index_col=0,header=None).dropna() 
    sum_of_all_files=sum_of_all_files.add(file_df,fill_value=0, axis='index') 

Vielen Dank!

BEARBEITEN: Ich möchte nach Index, d. H. Wenn zwei Zeilen den gleichen Index haben, fügen Sie sie hinzu. Ich habe den obigen Code korrigiert, indem ich "axis = 'index'" in der letzten Zeile hinzufüge.

+1

Was ist Ihr Ziel, alles in einen DF zu laden oder es im laufenden Betrieb zu verarbeiten und wieder auf die Festplatte zu schreiben? – MaxU

+0

@MaxU Das Ziel ist eine Tabelle mit dem Inhalt aller csv-Dateien, die von Schlüsseln hinzugefügt werden. Es kann in der Festplatte oder im Speicher sein ... – Escachator

+1

Wie viele Spalten haben csvs? – jezrael

Antwort

1

Sie können concat mit sum verwenden:

files = glob.glob('files/*.csv') 

dfs = [pd.read_csv(file_name,index_col=0,header=None).dropna() for file_name in files] 
df = pd.concat(dfs).sum() 
print (df) 
+0

Danke. Versucht es, wird berichten. Warum wäre dies "speichereffizienter"? – Escachator

+1

Gute Frage, ich bin nicht 100% sicher, ob es mehr Speicher effizient sein wird, denn wenn große Dateien verwendet werden, kann es problematisch sein. Aber das beste ist es zu testen. – jezrael

+0

Ich glaube, Concat und Summe wird nicht funktionieren, da ich Zeilen mit demselben Index für jedes Element von DFS summieren möchte. Ich denke, wir müssen das Problem zu summieren über wiederholte Indizes, sobald die concat ist fertig ... – Escachator

1

UPDATE: ich würde zu Ihrer Lösung fügen Sie einfach alle CSVs in Stücke zu lesen. Ich glaube, Sie werden es schon sehr gut in Bezug auf die Speichereinsparung zu tun ...

sum_of_all_files = pd.DataFrame() 
for file_name in list_of_files: 
    for file_df in pd.read_csv(file_name, index_col=0, header=None, chunksize=10**5) 
     sum_of_all_files = sum_of_all_files.add(file_df.dropna(), fill_value=0, axis='index') 

ALTE Antwort:

Idee: wir erste Datei in total DF lesen und dann werden wir lesen eine Datei in jedem Iterationsschritt beginnend mit der zweiten Datei in Ihrem list_of_files und fügen Sie es im laufenden Betrieb an die total DF

PS können Sie weiter gehen und lesen Sie jede CSV-Dateien in Chunks, wenn es riesige fi sind les, die nicht in den Speicher passen:

total = pd.read_csv(list_of_files[0], index_col=0, header=None).dropna() 

for f in list_of_files[1:]: 
    for chunk in pd.read_csv(f,index_col=0,header=None, chunksize=10**5): 
     total = total.add(chunk.dropna(), fill_value=0, axis='index') 
+0

danke! Werde das versuchen. Wenn ich dropna nicht verwende, wird die Anzahl der Zeilen "explodieren", da es in jeder Datei Millionen von leeren Zeilen gibt. Die Daten sind nicht ausgerichtet, ich muss sie nach Index hinzufügen. Und ich glaube, es gibt einen weiteren Fehler in meinem Code ... – Escachator

+1

@Escachator, sicher, versuchen Sie es – MaxU