按总和条件分组[重复]

Posted

技术标签:

【中文标题】按总和条件分组[重复]【英文标题】:Group by with sum conditions [duplicate] 【发布时间】:2019-06-18 02:37:59 【问题描述】:

我有以下 df,我想按 Date & Ref 对其进行分组,但要使用 sum 条件。

在这方面,只有当 P >= 比 PP 时,我才需要按 Date & Ref 和总和“Q”列进行分组。

df = DataFrame('Date' : ['1', '1', '1', '1'],
                'Ref' : ['one', 'one', 'two', 'two'],
                'P' : ['50', '65', '30', '38'],
                'PP' : ['63', '63', '32', '32'],
                'Q' : ['10', '15', '20', '10'])

df.groupby(['Date','Ref'])['Q'].sum() #This does the right grouping byt summing the whole column
df.loc[df['P'] >= df['PP'], ('Q')].sum() #this has the right sum condition, but does not divide between Date & Ref

有没有办法做到这一点? 非常感谢提前

【问题讨论】:

【参考方案1】:

你可以这样做:

import pandas as pd

df = pd.DataFrame('Date' : ['1', '1', '1', '1'],
                'Ref' : ['one', 'one', 'two', 'two'],
                'P' : ['50', '65', '30', '38'],
                'PP' : ['63', '63', '32', '32'],
                'Q' : ['10', '15', '20', '10'])

def conditional_sum(x):
    return x[x['P'] >= x['PP']].Q.sum()

result = df.groupby(['Date','Ref']).apply(conditional_sum)

print(result)

输出

Date  Ref
1     one    15
      two    10
dtype: object

更新

如果你想对输出中的多列求和,你可以使用loc:

def conditional_sum(x):
    return x.loc[x['P'] >= x['PP'], ['Q', 'P']].sum()


result = df.groupby(['Date', 'Ref']).apply(conditional_sum)

print(result)

输出

             Q     P
Date Ref            
1    one  15.0  65.0
     two  10.0  38.0

请注意,在上面的示例中,我使用列 P 是为了展示如何处理多个列。

【讨论】:

非常感谢丹尼尔!例如,如果想对列(Q、R、S)的列表求和?如何在 return x[x['P'] >= x['PP']].Q.sum() 中包含它? @Rose 更新了答案!【参考方案2】:

只在分组前过滤:

In[15]:
df[df['P'] >= df['PP']].groupby(['Date','Ref'])['Q'].sum()

Out[15]: 
Date  Ref
1     one    15
      two    10
Name: Q, dtype: object

这首先会减小 df 的大小,因此会加快 groupby 操作

【讨论】:

非常感谢 Ed。并将此分组除以总 Q(无条件)?有没有简单的方法? 如果您有新问题,那么您应该发布一个新问题,在 cmets 中回答新问题会适得其反。此外,您想对groupby 应用多个功能吗?您可能想阅读docs

以上是关于按总和条件分组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

相邻行熊猫的分组条件总和

在熊猫中按多个条件分组[重复]

大熊猫中分组的条件比率

与分组的总和计数[重复]

Swift - 执行分组和条件总和

如何根据不同的分组条件得到两个数量列的总和?