2016-01-25 49 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

相关问题