我有一个带有两个多级索引的pandas数据帧
df
Out[202]:
A B C D
first second
1 1 -0.080810 0.865259 -0.371148 0.346480
2 -0.026636 1.259460 -1.109295 -0.871204
3 0.372008 -1.778272 0.727838 0.620727
4 0.918075 0.564741 2.027432 -1.614162
5 -0.373527 -0.186027 0.225399 0.722733
2 1 0.344241 0.170596 -0.050763 2.692102
2 -1.665413 0.357033 -0.691327 -0.983103
3 1.277470 -1.841702 0.582107 -0.454315
4 2.374108 -0.557879 0.797296 0.803622
5 -1.001092 0.131217 0.131378 -0.636299
我还有一个第二个数据框,由原始数据框中' second == 1 '多重索引级别的两行组成。
to_subtract = df.query('second == 1')
to_subtract
Out[200]:
A B C D
first second
1 1 -0.080810 0.865259 -0.371148 0.346480
2 1 0.344241 0.170596 -0.050763 2.692102
我想在第一级上将“df”减去“to_subtract”,但是对于与多级索引的第一级相对应的所有值。就如下面所示,Pandas知道如何基于匹配所有多级索引级别进行减法。
df.sub(to_subtract)
Out[201]:
A B C D
first second
1 1 0.0 0.0 0.0 0.0
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN
2 1 0.0 0.0 0.0 0.0
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN
问题是,我该如何通过to_subtract [first == 1]减去df [first === 1]的所有值,并通过to_subtract [first == 2]减去df [first == 2]的所有值。我假设我可以使用for循环并遍历所有内容,但如果可能的话,我宁愿避免这样做,因为这些数据框在未来可能会变得更大。
提前感谢。
df - to_subtract
或df.sub(to_subtract)
都可以正常工作,不再需要level=0
。据我所知,这是因为pandas尽可能匹配尽可能多的共享索引级别。我不确定以前是否是这种情况;也许从来没有需要level=0
。就我所看到的,真正的魔力在于df.xs()
,它是一种超级优雅的按MultiIndex级别选择并删除该级别的方法,非常适合这种用例。 - Drew Levitt