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

咨询Pandas按多分组条件计算指定行平均值的更简洁实现方案

首先注意你现有代码的两处可优化点:

  1. 需求要求计算A1、A2的Value平均值,但现有代码聚合用的是np.sum,如果需要取平均替换为np.mean即可
  2. 分组得到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:36:03