2016-01-25 111 views
1

我有幾個存儲在字典中的類似結構的熊貓數據框。我以下面的方式訪問數據幀。合併具有非唯一索引的多個pandas數據集

ex_dict[df1] 
date  df1price1 df1price2 
10-20-2015  100   150 
10-21-2015  90   100 

我想將所有這些數據框合併到一個數據框到日期。日期重疊,但並非所有數據框都包含所有日期。

我需要從這個

df1 
date  df1price1 df1price2 
10-20-2015  100   150 
10-21-2015  90   100 
10-22-2015  100   140 

df2 
date  df2price1 df2price2 
10-20-2015  110   140 
10-21-2015  90   110 
10-23-2015  110   120 

df3 
date  df3price1 df3price2 
10-20-2015  100   150 
10-22-2015  90   100 
10-23-2015  80   130 

去這個:

df_all 
date  df1price1 df1price2 ... df3price1 df3price2 
10-20-2015  100   150 ... 100   150 
10-21-2015  90   100 ... NaN   NaN 
10-22-2015  100   140 ...  90   100 
10-23-2015  NaN   NaN ...  80   130 

我試過很多東西,但我不能讓它工作,短期的反覆合併2一次創建一個新的數據框,然後重新融入到這個框架中。我需要合併的數據幀的數量在4到10之間變化,所以我需要一種自動執行此操作的方法(因此爲什麼我認爲傳遞字典可能會起作用)。

對此的任何幫助將不勝感激。

+0

你嘗試'pandas.concat'? – BrenBarn

回答

1

您可以使用concat,然後使用groupby('date')平展結果。

In [22]: pd.concat([df1,df2,df3]).groupby('date').max() 
Out[22]: 
      df1price1 df1price2 df2price1 df2price2 df3price1 df3price2 
date 
10-20-2015  100  150  110  140  100  150 
10-21-2015   90  100   90  110  NaN  NaN 
10-22-2015  100  140  NaN  NaN   90  100 
10-23-2015  NaN  NaN  110  120   80  130 

編輯:作爲BrenBarn在評論中指出的那樣,你可以使用concat(axis=1)如果你設置了連接列作爲dataframes指數:

df1.index = df1.date 
df2.index = df2.date 
df3.index = df3.date 

In [44]: pd.concat([df1,df2,df3],axis=1) 
Out[44]: 
        date df1price1 df1price2  date df2price1 \ 
10-20-2015 10-20-2015  100  150 10-20-2015  110 
10-21-2015 10-21-2015   90  100 10-21-2015   90 
10-22-2015 10-22-2015  100  140   NaN  NaN 
10-23-2015   NaN  NaN  NaN 10-23-2015  110 

      df2price2  date df3price1 df3price2 
10-20-2015  140 10-20-2015  100  150 
10-21-2015  110   NaN  NaN  NaN 
10-22-2015  NaN 10-22-2015   90  100 
10-23-2015  120 10-23-2015   80  130 
+0

你可以在'axis = 1'中使用'concat'。 – BrenBarn

+0

@BrenBarn不會匹配日期 – maxymoo

+0

它應該只要它們是相同的。 – BrenBarn

0

你可以在date使用多個合併列:

df1.merge(df2, on='date', how='outer').merge(df3, on='date', how='outer').set_index('date') 

In [107]: df1.merge(df2, on='date', how='outer').merge(df3, on='date', how='outer').set_index('date') 
Out[107]: 
      df1price1 df1price2 df2price1 df2price2 df3price1 df3price2 
date 
10-20-2015  100  150  110  140  100  150 
10-21-2015   90  100   90  110  NaN  NaN 
10-22-2015  100  140  NaN  NaN   90  100 
10-23-2015  NaN  NaN  110  120   80  130 

一些解釋:首先你要合併df1df2date加入outer。與df3合併的結果數據框具有相同的屬性。 finnaly設置索引date爲您的結果日期。如果您dataframes已date列的索引,你可以先做reset_index爲他們每個人,並在含有列名合併date

+0

我認爲reset_index不起作用,因爲日期在每個數據集中不一定是唯一的。我不斷收到一個錯誤。 – Charles

相關問題