Pandas分组后取指定列Top K值对应另一列的均值求解
Pandas分组取前K大值对应列均值的正确实现
看起来你在尝试实现按指定列分组后,提取每组中col9前K大值对应的col10的均值,你的整体思路没问题,但原代码里有两处细节错误,导致无法得到预期结果,我来帮你修正并给出几种可行方案:
原代码的问题分析
grp.col9.nlargest(k_value)只返回了col9列的前K大值,丢失了对应的col10数据,后续自然无法计算目标列的均值mean('col10')用法错误:Pandas的mean()方法不需要传入列名参数,你需要先定位到对应的col10行数据再计算均值
方法一:直接用nlargest筛选行后计算均值
这是最直观的实现方式,分组后对每个子数据集筛选出col9前K大的行,再提取col10计算均值:
consideredCols = ['col4', 'col7'] k_value = 3 result = df1.groupby(consideredCols).apply( lambda grp: grp.nlargest(k_value, 'col9')['col10'].mean() ) print(result)
代码解释
grp.nlargest(k_value, 'col9'):返回当前分组内col9值排名前K的完整行数据['col10'].mean():从筛选后的行中提取col10列,计算该列的平均值
方法二:先排序再分组取数(适合大数据集)
如果你的数据集规模较大,apply结合nlargest的效率可能不够理想,可以先对整个数据集排序,再分组取前K行计算均值,这种方法通常更快:
# 先按分组列升序、col9降序排序 sorted_df = df1.sort_values( by=consideredCols + ['col9'], ascending=[True, True, False] ) # 分组取前K行,再按原分组列计算col10的均值 result = sorted_df.groupby(consideredCols).head(k_value)['col10'].groupby(consideredCols).mean() print(result)
代码解释
- 排序时先按分组列(
col4、col7)升序排列,保证同组数据集中在一起,再按col9降序排列,让每组内最大的K个值排在前面 groupby(...).head(k_value):提取每个分组的前K行- 最后再次按原分组列分组,计算
col10的均值
验证你的示例数据
我把你给出的示例整理成了规范的DataFrame,用方法一验证:
import pandas as pd # 示例数据 data = { 'col4': ['john', 'john', 'jane', 'jane'], 'col7': ['doe', 'doe', 'doe', 'doe'], 'col9': [5, 11, 50, 15], 'col10': [12, 9, 42, 27] } df1 = pd.DataFrame(data) k_value = 2 consideredCols = ['col4', 'col7'] # 计算结果 result = df1.groupby(consideredCols).apply( lambda grp: grp.nlargest(k_value, 'col9')['col10'].mean() ) print(result)
输出结果:
col4 col7 john doe 10.5 jane doe 34.5 dtype: float64
完全符合你的预期:John组(12+9)/2=10.5,Jane组(42+27)/2=34.5。
内容的提问来源于stack exchange,提问作者Ayush Soni
相关产品推荐
相关产品推荐

