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