如何在DataFrame分组聚合中统计最大值的出现次数?
按分组获取最大值及该最大值的出现次数
原始数据
原始DataFrame结构如下:
| Column1 | Column2 |
|---|---|
| John | 2 |
| John | 8 |
| John | 8 |
| John | 8 |
| Robert | 5 |
| Robert | 5 |
| Robert | 1 |
| Carl | 8 |
| Carl | 7 |
需求
按Column1分组聚合,获取每组的最大值,同时统计该最大值在组内的出现次数,期望输出:
| Column1 | Max | Count_of_Max |
|---|---|---|
| John | 8 | 3 |
| Robert | 5 | 2 |
| Carl | 8 | 1 |
原代码问题
你写的自定义函数Max_Count没必要重新通过df.loc[x.index]从原DataFrame取数,因为x本身就是分组后的Column2系列;同时原代码聚合后会生成多层列索引,需要调整列命名逻辑。
解决方案
方法一:改进自定义聚合函数
直接基于分组后的系列操作,同时指定聚合后的列名:
import pandas as pd # 构造原始数据 data = { 'Column1': ['John', 'John', 'John', 'John', 'Robert', 'Robert', 'Robert', 'Carl', 'Carl'], 'Column2': [2, 8, 8, 8, 5, 5, 1, 8, 7] } df = pd.DataFrame(data) def max_count(x): max_val = x.max() return x[x == max_val].count() # 执行聚合并设置列名 result = df.groupby('Column1')['Column2'].agg(Max='max', Count_of_Max=max_count).reset_index() print(result)
方法二:分步处理(无自定义函数)
先计算每组最大值,再合并回原数据统计次数,大数据量下性能更优:
import pandas as pd data = { 'Column1': ['John', 'John', 'John', 'John', 'Robert', 'Robert', 'Robert', 'Carl', 'Carl'], 'Column2': [2, 8, 8, 8, 5, 5, 1, 8, 7] } df = pd.DataFrame(data) # 第一步:计算每组最大值 group_max = df.groupby('Column1')['Column2'].max().reset_index(name='Max') # 第二步:合并数据并统计最大值出现次数 merged = df.merge(group_max, on='Column1') result = merged[merged['Column2'] == merged['Max']].groupby('Column1').agg( Max=('Max', 'first'), Count_of_Max=('Column2', 'count') ).reset_index() print(result)
方法三:使用transform简化操作
通过transform将每组最大值广播到原数据每一行,直接筛选统计:
import pandas as pd data = { 'Column1': ['John', 'John', 'John', 'John', 'Robert', 'Robert', 'Robert', 'Carl', 'Carl'], 'Column2': [2, 8, 8, 8, 5, 5, 1, 8, 7] } df = pd.DataFrame(data) # 添加每组最大值列 df['Max'] = df.groupby('Column1')['Column2'].transform('max') # 筛选最大值行并分组统计 result = df[df['Column2'] == df['Max']].groupby('Column1').agg( Max=('Max', 'first'), Count_of_Max=('Column2', 'count') ).reset_index() print(result)
以上三种方法均可得到预期输出,其中方法二、三避免了自定义聚合函数,在数据量较大时执行效率更高。
内容的提问来源于stack exchange,提问作者Sergei
相关产品推荐
相关产品推荐

