我有一个这种类型的pd数据框(列中的多索引):
measurement meas1 meas2 ...
observer obs1 obs2 obs1 obs2 ...
1 1 1 1 1
2 2 1 6 3
3 2 3 3 2
列索引是唯一的。 我想为每个测量创建观察者之间差异的数据框:
measurement meas1 meas2 ...
observerpair (obs1,obs2) (obs1,obs2) ...
1 0 0
2 1 3
3 -1 1
我尝试了两种不同的for循环来创建差异数据帧。这是在里面:
data[('meas1','obs1')].subtract(data[('meas1','obs2')])
或
data[('meas1','obs1')] - data[('meas1','obs2')]
我可以单独显示每一列,但每当我执行两次计算中的一次时,我得到的结果如下:
measurement meas1
observer obs1 obs2
1 NaN NaN
2 NaN NaN
3 NaN NaN
我已经尝试过这个相同结构的另一个数据帧(由同一个脚本自动生成),这个问题从未发生过。正如我所提到的,我自己检查了这些列,当它们被调用时它们看起来很正常:
data[('meas1','obs1')]
答案 0 :(得分:1)
df1 = df.xs('obs1', axis=1, level=1).sub(df.xs('obs2', axis=1, level=1))
print (df1)
measurement meas1 meas2
1 0 0
2 1 3
3 -1 1
如果想要MultiIndex
在输出中添加MultiIndex.from_product
:
df1 = df.xs('obs1', axis=1, level=1).sub(df.xs('obs2', axis=1, level=1))
df1.columns = pd.MultiIndex.from_product([df1.columns, ['obs1,obs2']],
names=df.columns.names)
print (df1)
measurement meas1 meas2
observerpair obs1,obs2 obs1,obs2
1 0 0
2 1 3
3 -1 1