2017-06-09 5 views
4

Ich habe mehrere (25k) .csv-Dateien, die ich in eine HDFStore-Datei anhängen möchte. Sie alle teilen sich identische Header. Ich verwende den folgenden Code, aber aus irgendeinem Grund wird der Datenrahmen nicht immer mit allen Dateien angehängt, sondern nur mit der letzten Datei in der Liste.Warum überschreibt meine for-Schleife statt anzuhängen?

filenames = [] #list of .csv file paths that I've alredy populated 
dtypes= {dict of datatypes} 
store = pd.HDFStore('store.h5') 
store.put('df', pd.read_csv(filenames[0],dtype=dtypes,parse_dates= 
["date"])) #store one data frame 

for f in filenames: 
    try: 
     temp_csv = pd.DataFrame() 
     temp_csv = pd.read_csv(f,dtype=dtypes,parse_dates=["trade_date"]) 
     store.append('df', temp_csv) 
    except: 
    pass 

Ich habe versucht, mit einer Teilmenge der Dateinamen Liste, aber immer den letzten Eintrag zu bekommen. Aus irgendeinem Grund hängt die Schleife meine Datei nicht an, sondern überschreibt sie jedes Mal. Jeder Rat würde geschätzt werden, da dies mich verrückt macht. (Python 3, Fenster)

+1

Wenn Sie es nicht mit 'Pandas' machen müssen, können Sie es mit dem normalen Python' open' Befehl machen. Werfen Sie einen Blick auf diese [link] (http://stackoverflow.com/questions/2363731/append-new-row-to-old-csv-file-python) – cookiedough

+0

Danke für den Vorschlag- ich werde es versuchen . Ich verwende diesen Ansatz, weil die csv-Dateien jeweils etwa 100k Zeilen haben und es 25k davon gibt. Wenn ich es nur mit einem Datenrahmen und nicht mit der hdf-Datei versuchte, stürzte mein Computer ständig ab, weil der Datensatz einfach zu groß war. –

+1

Fangen Sie alle ** außer ** sind selten eine gute Idee. Was versteckt sich ** außer: Pass **? –

Antwort

0

ich glaube, das Problem verwandt ist:

store.append('df', temp_csv)

Wenn ich richtig verstehe, was Sie versuchen, zu tun 'df' sollte jeder Iteration ändern, du bist überschreibt es jetzt einfach.

+0

Als ich versuchte, mein Laden enthielt alle df als separate Dateien. Laut der Dokumentation https://pandas.pydata.org/pandas-docs/stable/generated/pandas.HDFStore.append.html ist der erste Parameter der Schlüssel und der zweite der Wert. Es sei denn, ich lese das falsch. Ich arbeitete auch vom Beispiel "Tabellenformat", das hier gefunden wurde: http://pandas.pydata.org/pandas-docs/stable/io.html#io-hdf5. –

+1

Die Sache ist, dass ich nicht sicher bin, dass Sie zwei Werte für den gleichen Schlüssel haben können. Ich denke, dass der erste überschrieben wird – SeaMonkey

0

Sie erstellen/speichern einen neuen DataFrame mit jeder Iteration, wie @SeaMonkey sagt. Ihr konsolidierter Datenrahmen sollte außerhalb Ihrer Schleife instanziiert werden, in etwa so.

filenames = [] #list of .csv file paths that I've alredy populated 
dtypes= {dict of datatypes} 

df = pd.DataFrame() 
for f in filenames: 
    df_tmp = pd.read_csv(f,dtype=dtypes,parse_dates=["trade_date"]) 
    df = df.append(df_tmp) 

store = pd.HDFStore('store.h5') 
store.put('df', df) 
Verwandte Themen