我对Pandas数据框架比较陌生,我必须做简单的计算,但到目前为止我还没有找到一个很好的方法来解决它。
基本上我所拥有的是:
type group amount
1 A real 55
2 A fake 12
3 B real 610
4 B fake 23
5 B real 45
现在,我必须添加一个新列,以显示类型总计中假货的百分比。因此,此表的简单公式适用于A 12 / (55 + 12) * 100
和B 23 / (610 + 23 + 45) * 100
,表格应如下所示:
type group amount percentage
1 A real 55
2 A fake 12 17.91
3 B real 610
4 B fake 23
5 B real 45 3.39
我知道groupby
语句以及基本上我需要的所有组件(我猜...),但无法弄清楚如何组合以获得此结果。
答案 0 :(得分:1)
df['percentage'] = df.amount \
/ df.groupby(['type']) \
.amount.transform('sum').loc[df.group.eq('fake')]).fillna('')
df
如果fake
每个group
处理多个type
。我们可以更加小心。我将设置索引以在转换时保留type
和group
列。
c = ['type', 'group']
d1 = df.set_index(c, append=True)
d1.amount /= d1.groupby(level=['type']).amount.transform('sum')
d1.reset_index(c)
从这里开始,您可以选择单独保留或合并group
列。
d1.groupby(level=c).sum().reset_index()
答案 1 :(得分:0)
试试这个:
percentage = {}
for type in df.type.unique():
numerator = df[(df.type == type) & (df.group == 'fake')].amount.sum()
denominator = df[(df.type == type)].amount.sum()
percentage[type] = numerator / denominator * 100
df['percentage'] = list(df.type.map(percentage))
答案 2 :(得分:0)
如果您想确保每个类型占多个假组,您可以执行以下操作
type_group_total = df.groupby(['type', 'group']).transform('sum')
type_total = df.groupby('type')[['amount']].transform('sum')
df['percentage'] = type_group_total / type_total
输出
type group amount percentage
0 A real 55 0.820896
1 A fake 12 0.179104
2 B real 610 0.899705
3 B fake 23 0.100295
4 B fake 45 0.100295