Группировать по сумме условий
У меня есть следующий df, и я хотел бы сгруппировать его по дате и ссылке, но с условиями сумм.
В этом отношении мне нужно сгруппировать по дате и ссылке и суммировать столбец "Q", только если P>> чем PP.
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
Есть способ сделать это? Спасибо заранее
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 во-первых, поэтому ускорит групповую операцию
Вы могли бы сделать:
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
ради того, чтобы показать, как это сделать с несколькими столбцами.