Python 如何根据分组列计算DF值

Python 如何根据分组列计算DF值,python,pandas,dataframe,Python,Pandas,Dataframe,我对熊猫数据帧比较陌生,我必须做简单的计算,但到目前为止,我还没有找到一个好的方法 基本上我所拥有的是: type group amount 1 A real 55 2 A fake 12 3 B real 610 4 B fake 23 5 B real 45 现在,我必须添加一个新的列来显示冒牌货在

我对熊猫数据帧比较陌生,我必须做简单的计算,但到目前为止,我还没有找到一个好的方法 基本上我所拥有的是:

       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的
语句,基本上知道我需要的所有组件(我猜…),但不知道如何组合才能得到这个结果。

试试这个:

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))


如果在
组中处理多个
,则按
类型
。我们可以再小心一点。我将设置索引以在转换时保留
类型

c = ['type', 'group']
d1 = df.set_index(c, append=True)
d1.amount /= d1.groupby(level=['type']).amount.transform('sum')

d1.reset_index(c)


从这里,您可以选择不处理该问题,或者合并

d1.groupby(level=c).sum().reset_index()

如果您想确保每种类型有多个假组,可以执行以下操作

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

谢谢,这给了我很多新的工具来使用!这个答案假设每个组只有一个假组type@TedPetrou是的
  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