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

Pandas实现:为每个分组添加总计行并置于分组首行

问题:为Pandas分组添加总计行并置于分组首行

数据示例

owner   player  val1    val2    val3
A       x       5.60    3.18    0.76
A       y       12.08   15.95   -0.24
A       z       0.03    0.05    -0.41
B       x       0.02    0.01    2.06
B       z       2.36    2.37    0.00
C       x       0.16    0.15    0.05
C       y       0.72    0.75    -0.04
D       x       0.33    0.56    -0.41

期望输出

为每个owner分组计算数值列总计,将总计行放在分组第一行:

owner   player  val1    val2    val3
A      total    17.71   19.18   0.11
A      x        5.60    3.18    0.76
A      y        12.08   15.95   -0.24
A      z        0.03    0.05    -0.41
B      total    2.38    2.38    2.06
B      x        0.02    0.01    2.06
B      z        2.36    2.37    0.00
C      total    0.88    0.90    0.01
C      x        0.16    0.15    0.05
C      y        0.72    0.75    -0.04
D      total    0.33    0.56    -0.41
D      x        0.33    0.56    -0.41

尝试过的代码及问题

使用以下代码后,总计行位置不对,player列被字符串拼接,还产生多层索引:

def lambda_t(x):
    df = x.sort_values(['owner']).drop(['owner'],axis=1)
    df.loc['total'] = df.sum()
    return df

df.groupby(['owner']).apply(lambda_t)

异常输出:

owner       player  val1    val2    val3
A   0        x      5.60    3.18    0.76
    1        y      12.08   15.95   -0.24
    2        z      0.03    0.05    -0.41
    total    xzy    17.71   19.18   0.11
.....

删除多层索引后,player值仍异常,位置也未调整:

df.groupby(['owner']).apply(lambda_t).droplevel(level=1)

输出:

owner       player  val1    val2    val3
A            x      5.60    3.18    0.76
A            y      12.08   15.95   -0.24
A            z      0.03    0.05    -0.41
A            xzy    17.71   19.18   0.11

解决方案

通过以下代码可实现需求,适配多数值列场景:

import pandas as pd

# 构造示例数据(替换为你的真实数据读取逻辑)
data = {
    'owner': ['A','A','A','B','B','C','C','D'],
    'player': ['x','y','z','x','z','x','y','x'],
    'val1': [5.60,12.08,0.03,0.02,2.36,0.16,0.72,0.33],
    'val2': [3.18,15.95,0.05,0.01,2.37,0.15,0.75,0.56],
    'val3': [0.76,-0.24,-0.41,2.06,0.00,0.05,-0.04,-0.41]
}
df = pd.DataFrame(data)

def add_total_row(group):
    # 自动筛选数值列计算总和
    total_vals = group.select_dtypes(include='number').sum()
    # 构造总计行
    total_row = pd.DataFrame({
        'owner': [group['owner'].iloc[0]],
        'player': ['total'],
        **total_vals.to_dict()
    })
    # 合并总计行与原分组数据,总计行前置
    return pd.concat([total_row, group], ignore_index=True)

# 分组应用函数,生成最终结果
result = df.groupby('owner', group_keys=False).apply(add_total_row).reset_index(drop=True)

print(result)

代码说明

  • select_dtypes(include='number')自动识别所有数值列,无需手动指定列名,适配你25个数值列的场景
  • pd.concat([total_row, group])确保总计行排在分组最前端
  • group_keys=False避免生成多层索引,reset_index(drop=True)得到结构清晰的最终DataFrame

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:30:52