Згрупувати кадр даних і отримати суму І підрахувати?


82

У мене є фрейм даних, який виглядає так:

              Company Name              Organisation Name  Amount
10118  Vifor Pharma UK Ltd  Welsh Assoc for Gastro & Endo 2700.00
10119  Vifor Pharma UK Ltd    Welsh IBD Specialist Group,  169.00
10120  Vifor Pharma UK Ltd             West Midlands AHSN 1200.00
10121  Vifor Pharma UK Ltd           Whittington Hospital   63.00
10122  Vifor Pharma UK Ltd                 Ysbyty Gwynedd   75.93

Як підсумувати Amountта підрахувати Organisation Name, щоб отримати новий фрейм даних, який виглядає так?

              Company Name             Organisation Count   Amount
10118  Vifor Pharma UK Ltd                              5 11000.00

Я знаю, як підсумувати або порахувати:

df.groupby('Company Name').sum()
df.groupby('Company Name').count()

Але не як робити те й інше!

Відповіді:


147

спробуйте це:

In [110]: (df.groupby('Company Name')
   .....:    .agg({'Organisation Name':'count', 'Amount': 'sum'})
   .....:    .reset_index()
   .....:    .rename(columns={'Organisation Name':'Organisation Count'})
   .....: )
Out[110]:
          Company Name   Amount  Organisation Count
0  Vifor Pharma UK Ltd  4207.93                   5

або якщо ви не хочете скидати індекс:

df.groupby('Company Name')['Amount'].agg(['sum','count'])

або

df.groupby('Company Name').agg({'Amount': ['sum','count']})

Демо:

In [98]: df.groupby('Company Name')['Amount'].agg(['sum','count'])
Out[98]:
                         sum  count
Company Name
Vifor Pharma UK Ltd  4207.93      5

In [99]: df.groupby('Company Name').agg({'Amount': ['sum','count']})
Out[99]:
                      Amount
                         sum count
Company Name
Vifor Pharma UK Ltd  4207.93     5

2
@MaxU чи є спосіб застосувати суму та підрахунок до різних, але кількох кульмінацій. Коли я намагаюся надати стовпці як список у такий спосіб: agg ({['hotel_name', 'hotel_country']: 'count', ['cost', 'prihod', 'clicks']: 'sum'}) це дає Помилка "TypeError: unhashable type: 'list'"
CanCeylan

@CanCeylan не знає, чи можливо це зробити в груповому реченні, але ви можете досягти цього, додавши попередньо фіктивний стовпець-стовпець до фрейму даних, а потім зробіть групову суму:df['count'] = 1
Карл Анка

1
Нарешті, 2 години пошуків, як це зробити ... у мене спрацював лише третій варіант: df.groupby ('Назва компанії'). Agg ({'Сума': ['сума', 'кількість']}) .
charo

Привіт, дякую за чудове рішення. У моєму конкретному випадку я використовую ваше рішення на двох різних стовпцях, щоб отримати суму та підрахувати кількість рядків. На жаль, я отримую кількість рядків двічі (часто, оскільки це враховується для обох стовпців). Чи є спосіб видалити одну з .counts, щоб мій стіл виглядав чистим? df.groupby(df['L2 Name'])[["Amount arrear","VSU"]].agg(['sum','count'])
MLAlex

Привіт, дякую за чудову відповідь. Чи знаєте ви, як інтерпретувати створені нові стовпці та як згладити це більш традиційним способом?
Solal

20

Про всяк випадок, якщо вам було цікаво, як перейменовувати стовпці під час агрегування, ось як це зробити

pandas> = 0,25: Іменована агрегація

df.groupby('Company Name')['Amount'].agg(MySum='sum', MyCount='count')

Або,

df.groupby('Company Name').agg(MySum=('Amount', 'sum'), MyCount=('Amount', 'count'))

                       MySum  MyCount
Company Name                       
Vifor Pharma UK Ltd  4207.93        5

Це має бути виключена відповідь, чи є спосіб оновити старі запитання / відповіді новим кращим способом робити щось? Виключена відповідь не є неправильною, просто це вже не найкращий спосіб.
JSharm,

@JSharm, очевидно, ви не можете змінити думку ОП, але ви, безумовно, можете проголосувати за повідомлення, які, на вашу думку, заслуговують бути на вершині. Якщо достатня кількість людей думає і поводиться так само, як і ви, ми колись до цього дійдемо;) PS, щоб не кидати тінь на прийняту відповідь, я все ще вважаю, що це найкраща відповідь на це питання, поки панди продовжують підтримувати синтаксис, що я досить впевнений, ще надовго буде.
cs95

4

Якщо у вас багато стовпців, і лише один відрізняється, ви можете зробити:

In[1]: grouper = df.groupby('Company Name')
In[2]: res = grouper.count()
In[3]: res['Amount'] = grouper.Amount.sum()
In[4]: res
Out[4]:
                      Organisation Name   Amount
Company Name                                   
Vifor Pharma UK Ltd                  5  4207.93

Зверніть увагу, що потім можна перейменовувати стовпець „Назва організації”, як завгодно.


1
df.groupby('Company Name').agg({'Organisation name':'count','Amount':'sum'})\
    .apply(lambda x: x.sort_values(['count','sum'], ascending=False))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.