合并Pandas数据框并创建多级索引列

7

我有两个数据框,类似于这样:

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”)在列上提供名称。

1个回答

14
你可以使用concat的keys参数:
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

1
非常好。谢谢! - Daniel Goldfarb
1
请问您能否澄清一下,我正在尝试理解kwarg 'keys'的含义...文档有点简略:"keys:序列,默认为None。如果传递了多个级别,则应包含元组。使用传递的键构造分层索引作为最外层级别"在我看来,它意味着应该有与您要连接的对象数量相同的键。这正确吗?如果是这样,那么这如何与文档中的“多级”评论相关联?尝试更好地理解kwarg 'keys'如何在各种用例中使用。谢谢。 - Daniel Goldfarb
2
@DanielGoldfarb 是的,它们会“成为”结果MI的顶层。我认为文档建议您可以传递一个(相同大小的)元组列表,并且它可以生成更大的结果MI。通常,键将是一个平面列表(对应于连接对象)。在这个例子中,你最终得到了一个2级MI,但潜在地你可以得到一个(M+N)级MI。 - Andy Hayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接