如何使用 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.index
和 frame2.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 合并两个数据框?的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas 中将两个 MultiIndex 级别合并为一个
如何根据基于数据框的两个或多个条件在 MultiIndex 数据框中添加新行