Условная агрегация панд и безусловная агрегация вместе - PullRequest
0 голосов
/ 01 ноября 2019

Я опытный пользователь SQL и я новичок в Python и Pandas. У меня есть DataFrame.

import pandas as pd

data=[[1,100,'a'],[1,200,'b'],[2,300,'a'],[2,400,'a'],[3,500,'b'],[3,600,'a'],[3,700,'b']]

df=pd.DataFrame(data,columns=['Group','Amount','Condition'])

Можно ли рассчитать как условную сумму, так и «обычную» сумму за один шаг?

В принципе, в SQL это будет так.

select [Group]
,sum([Amount]) as Amount
,sum(case when [Condition]=’a’ then [Amount] end) as Conditional_Sum
from df
group by [Group]

Но в Пандах я разбил их на несколько шагов.

Для «обычной» суммы я использую

df1=df.groupby('Group')['Amount'].sum().reset_index()

Для условногосумма, я использую

df2=df.groupby('Group').apply(lambda x: x[x['Condition']=='a']['Amount'].sum()).to_frame(name='Conditional_Sum')
df2.reset_index(inplace=True)

Затем я объединяю df1 и df2. Могу ли я сделать это всего за один шаг?

Редактировать: чтобы уточнить, есть ли способ создать под фреймом данных один шаг?

   Group  Amount  Conditional_Sum
0      1     300              100
1      2     700              700
2      3    1800              600

1 Ответ

1 голос
/ 01 ноября 2019

Вы можете использовать групповое применение и создавать серии с несколькими столбцами

df.groupby('Group', as_index=False) \
  .apply(lambda x: pd.Series( \
        {'totalsum' : x['Amount'].sum(), \
         'condsum': x.loc[x['Condition']=='a','Amount'].sum()}))

       totalsum  condsum
0       300      100
1       700      700
2      1800      600
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...