2

我有以下df,我想按日期和参考对它进行分组,但有总和条件。

在这方面,我需要按日期和参考分组,并且仅当 P >= 而不是 PP 时才对“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

有没有办法做到这一点?提前谢谢了

4

2 回答 2

5

只需在分组前过滤:

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 操作

于 2019-01-24T11:17:32.980 回答
2

你可以这样做:

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

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

于 2019-01-24T11:17:04.267 回答