101

我有一个看起来像这样的数据框:

              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()

但不是如何做到这两点!

4

4 回答 4

183

尝试这个:

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
于 2016-07-03T20:44:23.497 回答
38

以防万一您想知道如何在聚合期间重命名列,这里是如何

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
于 2019-12-20T07:40:40.377 回答
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

请注意,您可以根据需要重命名“组织名称”列。

于 2017-04-19T16:29:31.390 回答
1
df.groupby('Company Name').agg({'Organisation name':'count','Amount':'sum'})\
    .apply(lambda x: x.sort_values(['count','sum'], ascending=False))
于 2018-10-22T02:19:27.100 回答