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

Pandas按group分组:计算value列均值并保留最高criticality行

问题描述

现有如下DataFrame:

import pandas as pd
df = pd.DataFrame({
    'text': ['a', 'a', 'a', 'b', 'b'],
    'group': [1, 1, 1, 2, 2],
    'value': [1, 2, 3, 4, 5],
    'some_other_to_include': ['a', 'a', 'c', 'b', 'b'],
    'criticality': [3, 3, 5, 4, 4]
})

需求:按group列分组,计算value列的平均值,同时选取每个组中criticality值最高的行并保留其他列。预期结果如下:

text    group    value    some_other_to_include    criticality
a       1        2        c                        5
b       2        4.5      b                        4

目前仅能通过手动构建新DataFrame,结合nlargest和均值计算实现,询问是否有更简便的方法。


简便实现方案

以下几种方法无需手动拼接DataFrame,利用pandas原生分组功能即可高效完成需求:

方法1:结合idxmax与合并逻辑

先获取每组criticality最大值对应的行,再合并组内value的均值:

# 提取每组criticality最高的行
max_crit_rows = df.loc[df.groupby('group')['criticality'].idxmax()]
# 计算每组value的平均值
value_means = df.groupby('group')['value'].mean().rename('value_mean')
# 合并结果并替换原value列
result = max_crit_rows.merge(value_means, on='group') \
                      .drop('value', axis=1) \
                      .rename(columns={'value_mean': 'value'})
# 调整列顺序以匹配预期结果
result = result[['text', 'group', 'value', 'some_other_to_include', 'criticality']]
print(result)

方法2:单次groupby.agg完成所有操作

通过字典为每列指定处理逻辑,一次分组即可完成均值计算和目标行提取:

def get_max_crit_col(col):
    # 获取当前组中criticality最大值对应的该列值
    return col.loc[df.loc[col.index, 'criticality'].idxmax()]

result = df.groupby('group').agg({
    'text': get_max_crit_col,
    'value': 'mean',
    'some_other_to_include': get_max_crit_col,
    'criticality': 'max'
}).reset_index()
# 调整列顺序
result = result[['text', 'group', 'value', 'some_other_to_include', 'criticality']]
print(result)

方法3:transform标记目标行后替换均值

先标记每组内criticality最高的行,再筛选这些行并将value替换为组均值:

# 标记每组中criticality最大的行
df['is_max_crit'] = df.groupby('group')['criticality'].transform(lambda x: x == x.max())
# 筛选目标行并复制避免修改原数据
result = df[df['is_max_crit']].copy()
# 将value替换为组内平均值
result['value'] = result.groupby('group')['value'].transform(lambda x: df.loc[x.index, 'value'].mean())
# 移除临时标记列
result = result.drop('is_max_crit', axis=1).reset_index(drop=True)
print(result)

内容的提问来源于stack exchange,提问作者Loxx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:03:22