熊猫划分两个多指数系列

时间:2017-12-18 21:27:33

标签: python pandas group-by

我有一个看起来像

的多索引系列
            value
foo bar baz     
1   A    C    6
         D    2
    B    D    6
         F    4
2   B    C    5
         F    7

我想总结一下foo和bar,得到每个foo,bar的值的总和,无论baz,我可以用df.groupby(level=[0, 1]).sum()来实现。这个系列看起来像:

        sum_value
foo bar      
1   A      8
    B      10
2   B      12

但是,我希望将原始value除以新sum_value,以获得baz的百分比,给定foo和bar。

            value
foo bar baz     
1   A    C    6/8=.75
         D    2/8=.25
    B    D    6/10=.6
         F    4/10=.5
2   B    C    5/12=.42
         F    7/12=.58

我尝试了df.div(df.groupby(level=[0, 1]).sum()),但收到了Not Implemented错误。谢谢!

3 个答案:

答案 0 :(得分:4)

你可以这样做,使用e与oringal dataframe的索引相加,然后将transform与Pandas内部数据对齐使用:

div

输出:

df.div(df.groupby(['foo','bar']).transform('sum'))

答案 1 :(得分:2)

In [40]: df['value'] = df.reset_index('baz', drop=True).div(df.sum(level=[0,1])).values

In [41]: df
Out[41]:
                value
foo bar baz
1.0 A   C    0.750000
        D    0.250000
    B   D    0.600000
        F    0.400000
2.0 B   C    0.416667
        F    0.583333

答案 2 :(得分:0)

这里的诀窍是使用transform对象的groupby方法:

from io import StringIO
import pandas

data = StringIO("""\
foo bar baz value
1   A    C    6
1   A    D    2
1   B    D    6
1   B    F    4
2   B    C    5
2   B    F    7
""")
df = pandas.read_table(data, sep='\s+', index_col=['foo', 'bar', 'baz'])
result = df.div(df.groupby(level=['foo', 'bar']).transform('sum'))
print(result)

                value
foo bar baz          
1   A   C    0.750000
        D    0.250000
    B   D    0.600000
        F    0.400000
2   B   C    0.416667
        F    0.583333

Transform返回一个与原始数据帧具有相同索引的系列:

print(df.groupby(level=['foo', 'bar']).transform('sum'))

                 value
foo bar baz       
1   A   C        8
        D        8
    B   D       10
        F       10
2   B   C       12
        F       12