咨询Pandas按多分组条件计算指定行平均值的更简洁实现方案
首先注意你现有代码的两处可优化点:
- 需求要求计算A1、A2的Value平均值,但现有代码聚合用的是
np.sum,如果需要取平均替换为np.mean即可 - 分组得到的df1未主动设置
Class='A12',最终拼接结果中A类聚合行的Class列会缺失,需要补充该字段
更简便的实现方案
方案1:简化版拼接逻辑(贴合你原有思路,无冗余中间变量)
import pandas as pd import numpy as np res = pd.concat( [ # 处理A1/A2分组聚合,直接赋值Class为A12 df.loc[df['Class'].isin(['A1', 'A2'])] .groupby(['Location', 'Type'], as_index=False) .agg({'Value': np.mean}) .assign(Class='A12'), # 直接保留所有B类行 df.loc[df['Class'] == 'B'] ], ignore_index=True # 自动重置索引,避免索引重复 )
该写法把你原有4行中间变量的逻辑合并为单表达式,代码更紧凑,同时自动处理了索引和Class字段赋值的问题。
方案2:自定义分组键逻辑(适用于后续扩展聚合规则)
如果你后续可能新增更多Class的合并聚合规则,可以用自定义分组键的方式实现:
# 定义分组规则:同一Location、Type下,A1/A2视为同一组,每个B类单独为一组 df['group_key'] = df.apply( lambda row: f"{row['Location']}_{row['Type']}_A12" if row['Class'] in ['A1','A2'] else f"{row['Location']}_{row['Type']}_B_{row.name}", axis=1 ) # 按分组键聚合,保留需要的字段 res = df.groupby('group_key', as_index=False).agg( Location=('Location', 'first'), Type=('Type', 'first'), Class=('Class', lambda x: 'A12' if x.isin(['A1','A2']).any() else x.iloc[0]), Value=('Value', 'mean') ).drop('group_key', axis=1)
内容的提问来源于stack exchange,提问作者Kimchi
相关产品推荐
相关产品推荐

