如何使用 MultiIndex 合并两个数据框?

Posted

技术标签:

【中文标题】如何使用 MultiIndex 合并两个数据框?【英文标题】:How to merge two dataframes with MultiIndex? 【发布时间】:2017-05-14 12:07:34 【问题描述】:

我有一个框架看起来像:

            2015-12-30  2015-12-31
300100  am    1             3
        pm    3             2
300200  am    5             1
        pm    4             5
300300  am    2             6
        pm    3             7

另一个框架看起来像

            2016-1-1    2016-1-2    2016-1-3    2016-1-4
300100  am    1           3            5           1
        pm    3           2            4           5
300200  am    2           5            2           6
        pm    5           1            3           7
300300  am    1           6            3           2
        pm    3           7            2           3
300400  am    3           1            1           3
        pm    2           5            5           2
300500  am    1           6            6           1
        pm    5           7            7           5

现在我想合并两个帧,合并后的帧是这样的:

             2015-12-30 2015-12-31  2016-1-1    2016-1-2    2016-1-3    2016-1-4
  300100  am    1          3           1           3           5           1
          pm    3          2           3           2           4           5
  300200  am    5          1           2           5           2           6
          pm    4          5           5           1           3           7
  300300  am    2          6           1           6           3           2
          pm    3          7           3           7           2           3
  300400  am                           3           1           1           3
          pm                           2           5           5           2
  300500  am                           1           6           6           1
          pm                           5           7           7           5

我尝试了 pd.merge(frame1,frame2,right_index=True,left_index=True),但它返回的不是所需的格式。任何人都可以帮忙吗?谢谢!

【问题讨论】:

frame1.indexframe2.index 是什么?输出有什么问题? frame1.index 是 MultiIndex(levels=[[300100.0, 300200.0, 300300.0], ['am', 'pm']], labels=[[0, -1, 1, -1, 2, -1], [0, 1, 0, 1, 0, 1]]) frame2.index 是 MultiIndex(levels=[[300100.0, 300200.0, 300300.0, 300400.0, 300500.0], ['am', 'pm']], labels=[[0, -1, 1 , -1, 2, -1, 3, -1, 4, -1], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]])。部分输出看起来像 2016-02-01 00:00:00_x 2016-02-02 00:00:00_x \ 300100.0 am 1 3 300200.0 am 5 1 300300.0 am 2 6 谢谢。但我认为更好的是如果您将图片更改为文本(因为不可能复制您的示例数据)并将有问题的输出添加到问题文本中,因为 cmets 中的格式有问题。 一个想法 - pd.concat([frame1, frame2], axis=1)pd.concat([frame1, frame2], axis=1, join='inner') 是如何工作的? 【参考方案1】:

你可以使用join

frame1.join(frame2, how='outer')

【讨论】:

【参考方案2】:

你可以使用concat:

print (pd.concat([frame1, frame2], axis=1))
           2015-12-30  2015-12-31  1.1.2016  2.1.2016  3.1.2016  4.1.2016
300100 am         1.0         3.0         1         3         5         1
       pm         3.0         2.0         3         2         4         5
300200 am         5.0         1.0         2         5         2         6
       pm         4.0         5.0         5         1         3         7
300300 am         2.0         6.0         1         6         3         2
       pm         3.0         7.0         3         7         2         3
300400 am         NaN         NaN         3         1         1         3
       pm         NaN         NaN         2         5         5         2
300500 am         NaN         NaN         1         6         6         1
       pm         NaN         NaN         5         7         7         5

第一列和第二列中的值被转换为float,因为NaN 值将int 转换为float - 请参阅docs。

一种可能的解决方案是将NaN 替换为int,例如0 再转成int:

print (pd.concat([frame1, frame2], axis=1)
         .fillna(0)
         .astype(int))
           2015-12-30  2015-12-31  1.1.2016  2.1.2016  3.1.2016  4.1.2016
300100 am           1           3         1         3         5         1
       pm           3           2         3         2         4         5
300200 am           5           1         2         5         2         6
       pm           4           5         5         1         3         7
300300 am           2           6         1         6         3         2
       pm           3           7         3         7         2         3
300400 am           0           0         3         1         1         3
       pm           0           0         2         5         5         2
300500 am           0           0         1         6         6         1
       pm           0           0         5         7         7         5

【讨论】:

以上是关于如何使用 MultiIndex 合并两个数据框?的主要内容,如果未能解决你的问题,请参考以下文章

在python中使用multiindex合并多个数据框

在 Pandas 中将两个 MultiIndex 级别合并为一个

熊猫多索引数据框合并问题

如何根据基于数据框的两个或多个条件在 MultiIndex 数据框中添加新行

如何用另一个的 MultiIndex 分割一个 MultiIndex DataFrame

合并pandas DataFrames时如何保留列MultiIndex值