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

Posted

技术标签:

【中文标题】分组数据框并获得总和和计数?【英文标题】:Group dataframe and get sum AND count? 【发布时间】:2021-07-15 17:22:20 【问题描述】:

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

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

但不是如何做到这两点!

【问题讨论】:

【参考方案1】:

试试这个:

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

【讨论】:

@MaxU 有没有一种方法可以将 sum 和 count 应用于不同但多个 coulmns。当我尝试将列作为这样的列表给出时: agg(['hotel_name','hotel_country']:'count', ['cost','revenue','clicks']: 'sum') 它给出"TypeError: unhashable type: 'list'" 错误 @CanCeylan 不知道是否可以在 groupby 子句中执行此操作,但您可以通过预先向数据帧添加一个虚拟计数列然后执行 groupby 总和来实现它:df['count'] = 1 最后,2 小时搜索如何做到这一点......只有第三个选项: df.groupby('Company Name').agg('Amount': ['sum',' count']) 为我工作。 您好,感谢您提供的出色解决方案。在我的特殊情况下,我在两个不同的列上使用您的解决方案来获取总和并计算行数。不幸的是,我得到了两次行数(ofc。因为它对两列都很重要)。有没有办法删除一个 .counts 让我的桌子看起来干净? df.groupby(df['L2 Name'])[["Amount arrear","VSU"]].agg(['sum','count']) 您好,感谢您的出色回答。您知道如何解释创建的新列以及如何将其展平为更传统的方式吗?【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:
df.groupby('Company Name').agg('Organisation name':'count','Amount':'sum')\
    .apply(lambda x: x.sort_values(['count','sum'], ascending=False))

【讨论】:

【参考方案4】:

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

熊猫 >= 0.25: Named Aggregation

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 显然您无法改变 OP 的想法,但您当然可以投票支持您认为应该排在首位的帖子。如果有足够多的人以与您相同的方式思考和行动,我们总有一天会到达那里;) PS 不要对已接受的答案投下阴影,我仍然认为只要 pandas 继续支持语法,它就是这个问题的最佳答案,我有理由相信这会持续很长时间。

以上是关于分组数据框并获得总和和计数?的主要内容,如果未能解决你的问题,请参考以下文章

使用条件和“分组依据”使用“分组依据”计算的计数记录总和

在同一分组中添加具有上述所有行总和的列

与分组的总和计数[重复]

如何在 MongoDB 中获得简单的计数和分组?

按列分组数据框并保存到不同的目录

如何根据不同的分组条件得到两个数量列的总和?