【问题标题】: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

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

【问题讨论】:

    标签: python python-3.x pandas group-by pandas-loc


    【解决方案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
    猜你喜欢
    • 2018-12-10
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多