如何按列名前缀与后缀分组汇总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
相关产品推荐
相关产品推荐

