我有一个看起来像
的多索引系列 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错误。谢谢!
答案 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