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

如何按列名前缀与后缀分组汇总Pandas DataFrame列?

Pandas按列名前缀和后缀分组求和方案

核心思路

  • 以列名的**前5位(如INV01)**作为设备编号分组依据
  • 以列名的**最后一位(I/V)**作为数据类型分组依据
  • 对同一设备、同类型的列求和,自定义新列名

代码实现

1. 准备示例数据

import numpy as np
import pandas as pd

data = [[20, 10, 13, 16, 18, 20, 9, 6], [7, 15, 11, 16, 27, 7, 19, 10]]
df = pd.DataFrame(data, columns=[
    'INV01_M1_I', 'INV01_M1_V',
    'INV01_M2_I', 'INV01_M2_V',
    'INV02_M1_I', 'INV02_M1_V',
    'INV02_M2_I', 'INV02_M2_V'
])

2. 高效切片分组法(适合固定格式列名)

直接通过列名字符串切片提取分组键,性能最优:

# 按前缀(前5位)和后缀(最后一位)分组求和
sum_result = df.groupby(
    [col[:5] for col in df.columns, col[-1] for col in df.columns],
    axis=1
).sum()

# 自定义新列名,格式可按需修改
sum_result.columns = [f'{prefix}_{suffix}_SUM' for prefix, suffix in sum_result.columns]

# 合并到原DataFrame(可选,不需要可以跳过)
df = pd.concat([df, sum_result], axis=1)

3. 正则分组法(适合灵活格式列名)

如果列名中间的Mx部分有变化,用正则提取分组键更稳妥:

import re

# 正则匹配:提取设备编号(INV+数字)和类型(I/V)
pattern = r'(INV\d+)_.*_(I|V)'

# 从列名中提取分组信息
group_keys = df.columns.str.extract(pattern).values.tolist()

# 分组求和
sum_result = df.groupby(group_keys, axis=1).sum()

# 自定义列名
sum_result.columns = [f'{dev}_TOTAL_{type}' for dev, type in sum_result.columns]

# 合并到原DataFrame
df = pd.concat([df, sum_result], axis=1)

输出示例

运行后新增的求和列如下:

INV01_I_SUM INV01_V_SUM INV02_I_SUM INV02_V_SUM
0 33 26 27 26
1 18 31 46 17

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:25:16