如何高效计算DataFrame分组后众数对应列的最大值?
高效实现按A分组统计B列众数及对应D列最大值
嘿,我来帮你搞定这个大数据量下的效率问题!你之前用for循环处理第三列确实会在数据量大的时候拖慢速度,咱们换成pandas的向量式分组聚合操作,完全避免循环,速度会快很多。
先明确你的需求
给定原始DataFrame:
| A | B | C | D |
|---|---|---|---|
| a | x | r | 1 |
| a | x | s | 2 |
| a | y | r | 1 |
| b | w | t | 4 |
| b | z | v | 2 |
需要按A分组后输出:
A:分组键freq of most common value in Column B:B列众数的出现次数maximum of column D based on the most common value in Column B:B列众数对应的D列最大值most common value in Column B:B列的众数
高效实现步骤
核心思路是先一次性统计每个(A,B)组合的频率和对应D的最大值,再筛选出每个A组内频率最高的B值,全程用pandas内置的分组操作,没有Python循环:
按(A,B)分组,计算频率和D的最大值
用groupby.agg一次性完成两个统计量的计算,避免多次分组:import pandas as pd # 先构造你的示例数据 df = pd.DataFrame({ 'A': ['a', 'a', 'a', 'b', 'b'], 'B': ['x', 'x', 'y', 'w', 'z'], 'C': ['r', 's', 'r', 't', 'v'], 'D': [1, 2, 1, 4, 2] }) # 按A和B分组,计算B的出现次数(freq)和对应D的最大值(max_D) grouped_stats = df.groupby(['A', 'B'], sort=False).agg( freq=('B', 'size'), # 统计每个(A,B)组合的出现次数 max_D=('D', 'max') # 统计每个(A,B)组合对应的D列最大值 ).reset_index()筛选每个A组内的B列众数
对每个A组,按freq降序排序,取第一行(也就是频率最高的B值,即众数):# 按A分组,筛选出每个组内freq最大的行(若有多个众数,取第一个出现的) result = grouped_stats.sort_values( by=['A', 'freq'], ascending=[True, False] # A升序,freq降序 ).groupby('A').head(1)调整列名和顺序,匹配需求格式
最后重命名列并调整顺序,得到你要的输出:# 重命名列 result = result.rename(columns={ 'freq': 'freq of most common value in Column B', 'max_D': 'maximum of column D based on the most common value in Column B', 'B': 'most common value in Column B' }) # 调整列的顺序 result = result[[ 'A', 'freq of most common value in Column B', 'maximum of column D based on the most common value in Column B', 'most common value in Column B' ]] print(result)
输出结果
运行后得到的结果完全符合你的需求:
| A | freq of most common value in Column B | maximum of column D based on the most common value in Column B | most common value in Column B |
|---|---|---|---|
| a | 2 | 2 | x |
| b | 1 | 4 | w |
为什么这个方法高效?
所有操作都是pandas底层优化的向量式操作,避免了Python层面的循环(比如你之前用的for循环),大数据量下能充分利用pandas的C扩展加速,速度会比循环快几个数量级。
内容的提问来源于stack exchange,提问作者ASDu
相关产品推荐
相关产品推荐

