连接多索引数据帧

Posted

技术标签:

【中文标题】连接多索引数据帧【英文标题】:Concating multiindex dataframes 【发布时间】:2017-09-04 23:47:17 【问题描述】:

我有一个多索引数据框,外层索引由股票名称组成,内层索引由日期组成。

                     Open        High        Low         Close
AAPL    2010-01-04  213.429998  214.499996  212.380001  214.009998  
        2010-01-08  210.299994  212.000006  209.060005  211.980005

OPK     2010-01-04  213.429998  214.499996  212.380001  214.009998  
        2010-01-08  210.299994  212.000006  209.060005  211.980005

我有一个新数据框,其中一些日期未包含在原始数据框中,我想附加它们。

                       Open          High        Low         Close

AAPL    2010-01-09  219.429998  219.499996  212.380001  214.009998  
        2010-01-10  219.299994  219.000006  209.060005  211.980005

OPK     2010-01-09  219.429998  219.499996  212.380001  214.009998  
        2010-01-10  219.299994  219.000006  209.060005  211.980005

所以我正在寻找的输出是

                      Open       High        Low         Close
AAPL    2010-01-04  213.429998  214.499996  212.380001  214.009998  
        2010-01-08  210.299994  212.000006  209.060005  211.980005
        2010-01-09  219.429998  219.499996  212.380001  214.009998  
        2010-01-10  219.299994  219.000006  209.060005  211.980005

        2010-01-04  213.429998  214.499996  212.380001  214.009998  
        2010-01-08  210.299994  212.000006  209.060005  211.980005
OPK     2010-01-09  219.429998  219.499996  212.380001  214.009998  
        2010-01-10  219.299994  219.000006  209.060005  211.980005

我尝试了这些变体

    pd.concat([stocks_df, df])
    pd.concat([stocks_df, df], levels = [stocks_df.index] )

但似乎无法找到解决方案。

【问题讨论】:

据我所知,第一个变体应该可以工作。 【参考方案1】:

我认为你需要concatsort_index

df = pd.concat([stocks_df, df]).sort_index()
print (df)
                       Open        High         Low       Close
AAPL 2010-01-04  213.429998  214.499996  212.380001  214.009998
     2010-01-08  210.299994  212.000006  209.060005  211.980005
     2010-01-09  219.429998  219.499996  212.380001  214.009998
     2010-01-10  219.299994  219.000006  209.060005  211.980005
OPK  2010-01-04  213.429998  214.499996  212.380001  214.009998
     2010-01-08  210.299994  212.000006  209.060005  211.980005
     2010-01-09  219.429998  219.499996  212.380001  214.009998
     2010-01-10  219.299994  219.000006  209.060005  211.980005

【讨论】:

这似乎有效。然而,奇怪的是,列的顺序又发生了变化,就像在新的 df 中混淆了一样。我得到Index(['15_Avg_Vol', '20_Avg_Vol', '30_Avg_Vol', '5days', '7days', '7days_10daysAvg', '9_Avg_Vol', 'Adj Close', 'Close', 'Daily_Change', 'High', 'Low', 'Open', 'Volume', 'changed' dtype='object') ` 我正在连接的较小的df 的列(仅在上面的OP 中的列)比较大的列少。但是,它们都以['Open', 'High', 'Low', 'Close', 'Volume'] 开头,所以不确定为什么要更改顺序。

以上是关于连接多索引数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何在不合并索引的情况下连接具有不同多索引的两个数据帧?

使用多索引迭代地连接 pandas 数据帧

使用 pandas 连接多索引列

使用多索引列连接两个 pandas 数据框

将函数应用于多索引多列数据帧的 Pythonic 方法是啥?

为啥 pandas 多索引数据帧切片看起来不一致?