熊猫划分两个多指数系列

问题描述 投票:5回答:3

我有一个看起来像的多索引系列

            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错误。谢谢!

python pandas group-by
3个回答
4
投票

你可以这样做,使用transform得到oringal数据帧的索引的总和然后使用div与Pandas内在数据对齐:

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

输出:

                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

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

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
© www.soinside.com 2019 - 2024. All rights reserved.