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

时间:2016-12-07 22:48:38

标签: python pandas dataframe

我对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语句以及基本上我需要的所有组件(我猜...),但无法弄清楚如何组合以获得此结果。

3 个答案:

答案 0 :(得分:1)

df['percentage'] = df.amount \
                 / df.groupby(['type']) \
                     .amount.transform('sum').loc[df.group.eq('fake')]).fillna('')
df

enter image description here

如果fake每个group处理多个type。我们可以更加小心。我将设置索引以在转换时保留typegroup列。

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

d1.reset_index(c)

enter image description here

从这里开始,您可以选择单独保留或合并group列。

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

enter image description here

答案 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