pandas dataframe:在进行涉及两个数据帧的算术运算时,如何在多个索引级别上进行匹配

时间:2013-03-05 16:15:06

标签: indexing dataframe match pandas hierarchical

我在主索引上有三个级别的DataFrame:

from pandas import *
df_multi = DataFrame(np.random.rand(6,2), index = [['CF', 'CF', 'CF', 'DA', 'DA','DA'], ['x', 'y', 'y', 'x', 'y', 'y'], ['a', 'b', 'a', 'a', 'a', 'b']], columns = ['PC1', 'PC2'])
df_multi.index.names =['l1','l2','l3']

In [5]: df_multi
Out[5]: 
       PC1       PC2
l1 l2 l3                    
CF x  a   0.118061  0.473159
   y  b   0.159534  0.407676
      a   0.466731  0.163322
DA x  a   0.152799  0.333438
   y  a   0.632725  0.965348
      b   0.737112  0.834592

现在我希望在第三级之间进行求和,然后将每个元素除以其相应的总和以获得第三级的份额(例如,将(CF, x, a)除以(CF, x, a),将(CF, y, a)除以{ {1}}等。)

(CF, y, a) + (CF, y, b)

In [6]: df_multi.sum(level = [0, 1])
Out[6]: 
    PC1       PC2
l1 l2                    
CF x   0.118061  0.473159
   y   0.626265  0.570998
DA x   0.152799  0.333438
   y   1.369837  1.799940

然而,这不起作用。我正在寻找一个通用的解决方案,不仅限于百分比份额的计算,这使我能够在多个级别上进行算术匹配。它仅在使用一个级别时才起作用,例如

df_multi_share = df_multi.div(df_multi.sum(level = [0, 1]), level=[0, 1])

1 个答案:

答案 0 :(得分:2)

这听起来像是transform的工作。

df_multi.groupby(level=[0,1]).transform(lambda x: x/x.sum())

相关文件: http://pandas.pydata.org/pandas-docs/stable/groupby.html#transformation