2014-10-14 12 views
5

To była zmora mego życia od kilku dni. Mam wiele Pandas Dataframes, które zawierają dane szeregów czasowych o nieregularnych częstotliwościach. Próbuję je wyrównać w jedną ramkę danych.Pandy wyrównujące wiele ramek danych ze wskaźnikiem TimeStamp

Poniżej jest jakiś kod, z reprezentatywnymi dataframes, df1, df2 i df3 (I rzeczywiście n = 5, i doceni rozwiązanie, które będzie działać dla wszystkich n>2):

# 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 

mam pomysł, dlaczego ten błąd, więc pozbyć się duplikatów indeksów w combined_1_n_2 i spróbuj jeszcze raz:

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 

Dlaczego otrzymuję ten błąd? Nawet jeśli to zadziałało, jest całkowicie ręczne i brzydkie. Jak wyrównać> 2 serie czasowe i połączyć je w jedną ramkę danych?

danych:

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' ] ]) 

Odpowiedz

3

Twój specyficzny błąd jest spowodowany nazwy kolumn combined_1_n_2 posiadających duplikatów (obie kolumny zostanie nazwany „cena”). Można zmienić nazwy kolumn, a drugie wyrównywanie zadziała.

Jednym z alternatywnych sposobów byłoby połączenie operatora join, który scala ramki w indeksie, jak poniżej.

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

Dziękuję, to zaskakujące; więc "align()" jest zbędne, jeśli wykonuję łączenia łańcuchów? – Rhubarb

+0

Prawidłowo, 'join' obsługuje logikę indeksu. – chrisb

+0

Dziękuję, z ciekawości: czy mógłbyś krótko się nad tym zastanowić, kiedy trzeba użyć funkcji align(), a następnie? Ponieważ dla mnie wydaje się, że join() obsługuje zarówno wyrównanie, jak i konkatenację za jednym razem. – Rhubarb