分组数据帧并获得总和和计数?

Ric*_*ard 64 python numpy dataframe pandas

我有一个如下所示的数据框:

              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
Run Code Online (Sandbox Code Playgroud)

如何总结Amount和计算Organisation Name,以获得看起来像这样的新数据框?

              Company Name             Organisation Count   Amount
10118  Vifor Pharma UK Ltd                              5 11000.00
Run Code Online (Sandbox Code Playgroud)

我知道如何总结计算:

df.groupby('Company Name').sum()
df.groupby('Company Name').count()
Run Code Online (Sandbox Code Playgroud)

但不是两个怎么做!

Max*_*axU 112

试试这个:

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
Run Code Online (Sandbox Code Playgroud)

或者如果您不想重置索引:

df.groupby('Company Name')['Amount'].agg(['sum','count'])
Run Code Online (Sandbox Code Playgroud)

要么

df.groupby('Company Name').agg({'Amount': ['sum','count']})
Run Code Online (Sandbox Code Playgroud)

演示:

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
Run Code Online (Sandbox Code Playgroud)

  • @MaxU有一种方法可以将sum和count应用于不同但多个coulmns.当我尝试将列列为这样的列表时:agg({['hotel_name','hotel_country']:'count',['cost','revenue','clicks']:'sum'})它给出了"TypeError:unhashable type:'list'"错误 (2认同)

cs9*_*s95 31

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

pandas >= 0.25:命名聚合

df.groupby('Company Name')['Amount'].agg(MySum='sum', MyCount='count')
Run Code Online (Sandbox Code Playgroud)

或者,

df.groupby('Company Name').agg(MySum=('Amount', 'sum'), MyCount=('Amount', 'count'))
Run Code Online (Sandbox Code Playgroud)

                       MySum  MyCount
Company Name                       
Vifor Pharma UK Ltd  4207.93        5
Run Code Online (Sandbox Code Playgroud)


JSh*_*arm 5

如果您有很多列并且只有一列不同,您可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

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