【问题标题】:Combine Pandas DataFrames while creating MultiIndex Columns在创建 MultiIndex 列时合并 Pandas DataFrames
【发布时间】:2019-08-27 18:45:40
【问题描述】:

我有两个 DataFrame,如下所示:

import pandas as pd

dates = pd.Index(['2016-10-03', '2016-10-04', '2016-10-05'], name='Date')

close = pd.DataFrame( {'AAPL': [112.52,  113., 113.05],
                       'CSCO': [  31.5, 31.35, 31.59 ],
                       'MSFT': [ 57.42, 57.24, 57.64 ] }, index = dates )

volume= pd.DataFrame( {'AAPL': [21701800, 29736800, 21453100] ,
                       'CSCO': [14070500, 18460400, 11808600] ,
                       'MSFT': [19189500, 20085900, 16726400] }, index = dates )

DataFrame 'close' 的输出如下所示:

              AAPL   CSCO   MSFT
Date
2016-10-03  112.52  31.50  57.42
2016-10-04  113.00  31.35  57.24
2016-10-05  113.05  31.59  57.64

DataFrame 'volume' 的输出如下所示:

                AAPL      CSCO      MSFT
Date
2016-10-03  21701800  14070500  19189500
2016-10-04  29736800  18460400  20085900
2016-10-05  21453100  11808600  16726400

我想将这两个 DataFrame 组合成一个带有 MultiIndex COLUMNS 的 DataFrame,使其看起来像这样:

              AAPL                CSCO                MSFT
             Close     Volume    Close     Volume    Close     Volume  
Date
2016-10-03  112.52   21701800    31.50   14070500    57.42   19189500
2016-10-04  113.00   29736800    31.35   18460400    57.24   20085900
2016-10-05  113.05   21453100    31.59   11808600    57.64   16726400

谁能告诉我如何做到这一点?我一直在玩 pd.concat 和 pd.merge,但我不清楚如何让它与日期索引对齐并允许我为子索引提供名称('Close' 和 'Volume' ) 在列上。

【问题讨论】:

    标签: pandas multi-index


    【解决方案1】:

    你可以使用 concat 的keys kwarg:

    In [11]: res = pd.concat([close, volume], axis=1, keys=["close", "volume"])
    
    In [12]: res
    Out[12]:
                 close                  volume
                  AAPL   CSCO   MSFT      AAPL      CSCO      MSFT
    Date
    2016-10-03  112.52  31.50  57.42  21701800  14070500  19189500
    2016-10-04  113.00  31.35  57.24  29736800  18460400  20085900
    2016-10-05  113.05  31.59  57.64  21453100  11808600  16726400
    

    稍作调整:

    In [13]: res.swaplevel(0, 1, axis=1).sort_index(axis=1)
    Out[13]:
                  AAPL             CSCO             MSFT
                 close    volume  close    volume  close    volume
    Date
    2016-10-03  112.52  21701800  31.50  14070500  57.42  19189500
    2016-10-04  113.00  29736800  31.35  18460400  57.24  20085900
    2016-10-05  113.05  21453100  31.59  11808600  57.64  16726400
    

    【讨论】:

    • 优秀。谢谢!
    • 你能否澄清一下,试图理解 kwarg 'keys' ...文档有点稀疏:“keys : sequence, default None 如果通过了多个级别,应该包含元组。构造层次索引使用传递的键作为最外层”在我看来,这意味着应该有与您要连接的对象相同数量的键。那是对的吗?如果是这样,这与文档中的“多级”注释有什么关系?试图更好地理解如何在各种用例中使用 kwarg 'keys'。谢谢。
    • @DanielGoldfarb 是的,它们“成为”最终 MI 的顶层。我认为文档建议您可以传递(相同大小的)元组列表,它可以产生更大的 MI。通常键是一个平面列表(对应于 concat 对象)。在此示例中,您最终会得到 2 级 MI,但可能最终会得到 (M+N) 级 MI。
    猜你喜欢
    • 2018-01-29
    • 2021-12-13
    • 2018-07-22
    • 2020-06-15
    • 2018-06-25
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多