我有一个带有两个多索引级别的 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
我还有第二个数据帧,由原始数据帧中的两行组成,对应于多索引级别“第二个== 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
我想在第一级上用“to_subtract”减去“df”,但对于与多重索引的第一级相对应的所有值。 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 循环并循环遍历所有内容,但如果可以的话我宁愿避免这种情况,因为这些数据帧将来可能会变得很大。
提前致谢
最佳答案
我认为需要删除 MultiIndex
的第二级,然后添加参数 level=0
以按 DataFrame.sub
中的第一级对齐:
to_subtract = df.query('second == 1').reset_index(level=1, drop=True)
#same as
#to_subtract = df.xs(1, level=1)
print (to_subtract)
A B C D
first
1 -0.080810 0.865259 -0.371148 0.346480
2 0.344241 0.170596 -0.050763 2.692102
df1 = df.sub(to_subtract, level=0)
print (df1)
A B C D
first second
1 1 0.000000 0.000000 0.000000 0.000000
2 0.054174 0.394201 -0.738147 -1.217684
3 0.452818 -2.643531 1.098986 0.274247
4 0.998885 -0.300518 2.398580 -1.960642
5 -0.292717 -1.051286 0.596547 0.376253
2 1 0.000000 0.000000 0.000000 0.000000
2 -2.009654 0.186437 -0.640564 -3.675205
3 0.933229 -2.012298 0.632870 -3.146417
4 2.029867 -0.728475 0.848059 -1.888480
5 -1.345333 -0.039379 0.182141 -3.328401
关于python - pandas 在多索引级别匹配上减去,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49607158/