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
相关产品推荐
相关产品推荐

