web-dev-qa-db-ja.com

データフレームをグループ化し、合計とカウントを取得しますか?

次のようなデータフレームがあります。

              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

私は合計する方法を知っていますor count:

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

しかし、両方を行う方法ではありません!

54
Richard

これを試して:

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
105
MaxU

多くの列があり、1つだけが異なる場合は、次のようにできます。

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

その後、必要に応じて[組織名]列の名前を変更できることに注意してください。

1
JSharm