合并具有非唯一索引的多个熊猫数据集

Posted

技术标签:

【中文标题】合并具有非唯一索引的多个熊猫数据集【英文标题】:Merging multiple pandas datasets with non-unique index 【发布时间】:2016-05-01 07:30:31 【问题描述】:

我有几个存储在字典中的类似结构的 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 可能有效)。

对此的任何帮助将不胜感激。

【问题讨论】:

你试过pandas.concat吗? 【参考方案1】:

您可以在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 合并的结果数据框。最后为您的结果日期框架设置索引date。如果您的数据框有 date 列作为索引,您可以首先为每个列执行 reset_index 并合并包含 date 的列名

【讨论】:

我认为 reset_index 不起作用,因为每个数据集中的日期不一定是唯一的。我一直收到那个错误。【参考方案2】:

您可以使用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 在 cmets 中指出的那样,如果您将连接列设置为数据框的索引,则可以使用 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

【讨论】:

您可以只使用concataxis=1 @BrenBarn 不会匹配日期 只要它们相同就应该。 您还应该在每个数据框中删除date 列以实现所需的输出 groupby 做到了。在我得到第二个解决方案之前,但我无法将其展平。非常感谢。

以上是关于合并具有非唯一索引的多个熊猫数据集的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别

唯一与非唯一索引

MongoDB中唯一索引的优势

合并具有不同索引的熊猫系列(对齐一个索引)

pandas.concat:无法处理非唯一的多索引!熊猫蟒

MySQL 5.0 索引 - 唯一与非唯一