2014-10-14 4 views
5

Dies war der Fluch meines Lebens in den letzten paar Tagen. Ich habe zahlreiche Pandas-Dataframes, die Zeitreihendaten mit unregelmäßigen Häufigkeiten enthalten. Ich versuche, diese in einen einzigen Datenrahmen zu bringen.Pandas, die mehrere Datenrahmen mit TimeStamp index ausrichten

Unten finden Sie einige Code, mit repräsentativen Datenrahmen, df1, df2 und df3 (ich habe tatsächlich n = 5, und würde eine Lösung zu schätzen wissen, die für alle n>2 funktionieren würde):

# df1, df2, df3 are given at the bottom 
import pandas as pd 
import datetime 

# I can align df1 to df2 easily 
df1aligned, df2aligned = df1.align(df2) 
# And then concatenate into a single dataframe 
combined_1_n_2 = pd.concat([df1aligned, df2aligned], axis =1) 
# Since I don't know any better, I then try to align df3 to combined_1_n_2 manually: 
combined_1_n_2.align(df3) 
error: Reindexing only valid with uniquely valued Index objects 

ich eine haben Idee, warum ich diesen Fehler, so dass ich in combined_1_n_2 der doppelten Indizes los und versuchen Sie es erneut:

combined_1_n_2 = combined_1_n_2.groupby(combined_1_n_2.index).first() 
combined_1_n_2.align(df3) # But stll get the same error 
error: Reindexing only valid with uniquely valued Index objects 

Warum bin ich diesen Fehler? Auch wenn das funktionierte, ist es komplett manuell und hässlich. Wie kann ich> 2 Zeitreihen ausrichten und in einem einzigen Datenrahmen kombinieren?

Daten:

df1 = pd.DataFrame({'price' : [62.1250,62.2500,62.2375,61.9250,61.9125 ]}, 
        index = [pd.DatetimeIndex([datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')])[0] 
        for s in ['2008-06-01 06:03:59.614000', '2008-06-01 06:03:59.692000', 
        '2008-06-01 06:15:42.004000', '2008-06-01 06:15:42.083000','2008-06-01 06:17:01.654000' ] ]) 

df2 = pd.DataFrame({'price': [241.0625, 241.5000, 241.3750, 241.2500, 241.3750 ]}, 
        index = [pd.DatetimeIndex([datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')])[0] 
        for s in ['2008-06-01 06:13:34.524000', '2008-06-01 06:13:34.602000', 
        '2008-06-01 06:15:05.399000', '2008-06-01 06:15:05.399000','2008-06-01 06:15:42.082000' ] ]) 

df3 = pd.DataFrame({'price': [67.656, 67.875, 67.8125, 67.75, 67.6875 ]}, 
        index = [pd.DatetimeIndex([datetime.datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f')])[0] 
        for s in ['2008-06-01 06:03:52.281000', '2008-06-01 06:03:52.359000', 
        '2008-06-01 06:13:34.848000', '2008-06-01 06:13:34.926000','2008-06-01 06:15:05.321000' ] ]) 

Antwort

3

Ihre spezifischen Fehler zurückzuführen ist, die Spaltennamen von combined_1_n_2 mit Duplikaten (beide Spalten genannt werden ‚Preis‘). Sie könnten die Spalten umbenennen und die zweite Ausrichtung würde funktionieren.

Ein alternativer Weg wäre, den Operator join zu verketten, der Frames auf dem Index zusammenführt, wie unten.

In [23]: df1.join(df2, how='outer', rsuffix='_1').join(df3, how='outer', rsuffix='_2') 
Out[23]: 
           price price_1 price_2 
2008-06-01 06:03:52.281000  NaN  NaN 67.6560 
2008-06-01 06:03:52.359000  NaN  NaN 67.8750 
2008-06-01 06:03:59.614000 62.1250  NaN  NaN 
2008-06-01 06:03:59.692000 62.2500  NaN  NaN 
2008-06-01 06:13:34.524000  NaN 241.0625  NaN 
2008-06-01 06:13:34.602000  NaN 241.5000  NaN 
2008-06-01 06:13:34.848000  NaN  NaN 67.8125 
2008-06-01 06:13:34.926000  NaN  NaN 67.7500 
2008-06-01 06:15:05.321000  NaN  NaN 67.6875 
2008-06-01 06:15:05.399000  NaN 241.3750  NaN 
2008-06-01 06:15:05.399000  NaN 241.2500  NaN 
2008-06-01 06:15:42.004000 62.2375  NaN  NaN 
2008-06-01 06:15:42.082000  NaN 241.3750  NaN 
2008-06-01 06:15:42.083000 61.9250  NaN  NaN 
2008-06-01 06:17:01.654000 61.9125  NaN  NaN 
+0

Danke, das ist überraschend; also ist das 'align()' unnötig, wenn ich die Kettenverbindungen mache? – Rhubarb

+0

Korrekt, 'Join' behandelt die Indexlogik für Sie. – chrisb

+0

Danke, aus Neugierde: Könntest du kurz darauf eingehen, wenn man dann die align() benutzen muss? Weil es scheint, dass join() sowohl die Ausrichtung als auch die Verkettung in einem Zug handhabt. – Rhubarb

Verwandte Themen