Python 使用非唯一索引合并多个数据集

Python 使用非唯一索引合并多个数据集,python,pandas,merge,concat,Python,Pandas,Merge,Concat,我在字典中存储了几个结构类似的数据帧。我通过以下方式访问数据帧 ex_dict[df1] date df1price1 df1price2 10-20-2015 100 150 10-21-2015 90 100 我想按日期将所有这些数据帧合并为一个数据帧。日期重叠,但并非所有数据帧都包含所有日期 我需要从这开始 df1 date df1price1 df1price2 10-20-2015 100

我在字典中存储了几个结构类似的数据帧。我通过以下方式访问数据帧

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之间变化,因此我需要一种自动完成这项工作的方法(因此我认为传递dict可能有效)


非常感谢您在这方面提供的任何帮助。

您可以使用
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)

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

您可以在
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

一些解释:首先,您将在列
date
上合并
df1
df2
,并加入
outer
。使用相同的属性与
df3
合并的结果数据帧。最后,为生成的日期框设置索引
date
。如果您的数据帧有
date
列作为索引,您可以首先对它们中的每一列执行
reset\u index
,然后合并到包含
date

的列名上。您是否尝试过
pandas.concat
?您可以将
concat
axis=1
@BrenBarn no一起使用,但不匹配日期它们是一样的。您还应该在每个数据帧中删除
date
列,以获得所需的输出。groupby做到了这一点。在我得到第二个解决方案之前,但我无法将其展平。非常感谢。我认为重置索引不起作用,因为每个数据集中的日期不一定是唯一的。我一直在那个问题上出错。