大熊猫多指标列的成对减法

时间:2018-03-14 13:45:57

标签: python pandas

我有一个这种类型的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')]

1 个答案:

答案 0 :(得分:1)

您可以在MultiIndexxs中使用sub选择列:

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