合并具有非唯一索引的多个 pandas 数据集
Merging multiple pandas datasets with non-unique index
我有几个结构相似的 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 之间变化,所以我需要一种自动执行此操作的方法(因此我认为传递一个 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_index
并合并包含 date
的列名
我有几个结构相似的 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 之间变化,所以我需要一种自动执行此操作的方法(因此我认为传递一个 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_index
并合并包含 date