熊猫:计算多指数

时间:2015-10-29 21:39:45

标签: python pandas

我有一个类似的数据框:

enter image description here

我想减去像:

这样的值

enter image description here

减去

enter image description here

到目前为止我尝试了什么(数据框:http://pastebin.com/PydRHxcz):

index = pd.MultiIndex.from_tuples([key for key in dfdict], names = ['a','b','c','d'])
dfl = pd.DataFrame([dfdict[key] for key in dfdict],index=index)
dfl.columns = ['data']
dfl.sort(inplace=True)
d = dfl.unstack(['a','b'])

我能做到:

d[0:5] - d[0:5]

我得到所有值的零。

但如果我这样做:

d[0:5] - d[5:]

我为所有价值获得了Nans。任何想法如何我可以执行这样的操作?

编辑:

什么有效

dfl.unstack(['a','b'])['data'][5:] - dfl.unstack(['a','b'])['data'][0:5].values

但感觉有点笨拙

1 个答案:

答案 0 :(得分:4)

您可以使用loc选择与第一级中的一个标签对应的所有行,如下所示:

In [8]: d.loc[0]
Out[8]:
          data                                                        ...
a         0.17                                       1.00
b          0          5         10         500        0          5
d
0.0  11.098909   9.223784  8.003650  10.014445  13.231898  10.372040
0.3  14.349606  11.420565  9.053073  10.252542  26.342501  25.219403
0.5   1.336937   2.522929  3.875139  11.161803   3.168935   6.287555
0.7   0.379158   1.061104  2.053024  12.358577   0.678352   2.133887
1.0   0.210244   0.631631  1.457333  15.117805   0.292904   1.053916

所以做减法看起来像:

In [11]: d.loc[0] - d.loc[1000]
Out[11]:
           data                                                         ...
a          0.17                                        1.00
b           0          5          10        500         0          5
d
0.0   -3.870946  -3.239915  -3.504068 -0.722377   -2.335147  -2.460035
0.3  -65.611418 -42.225811 -25.712668 -1.028758  -65.106473 -44.067692
0.5  -84.494748 -55.186368 -34.184425 -1.619957  -89.356417 -69.008567
0.7  -92.681688 -61.636548 -37.386604 -4.227343 -110.501219 -78.925078
1.0 -101.071683 -61.758741 -37.080222 -3.081782 -103.779698 -80.337487