You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码解释

  1. 排序时先按分组列(col4、col7)升序排列,保证同组数据集中在一起,再按col9降序排列,让每组内最大的K个值排在前面
  2. groupby(...).head(k_value):提取每个分组的前K行
  3. 最后再次按原分组列分组,计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:13:24