如何系统化地对Pandas数据框中对应组合列求和生成新列
如何系统化地对Pandas数据框中对应组合列求和生成新列
看起来你需要的是对每个原始元素i,求所有包含i的组合列的行和,这个需求完全可以用通用化的方法实现,不用手动写每个f_i的公式。下面是针对这个场景的通用解决方案,不管你是4个元素还是20个元素都能直接用:
核心思路
我们可以先把列名拆分成对应的元素对,然后为每个元素i筛选出所有包含它的列,最后按行求和生成f_i列——整个过程完全自动化,不需要硬编码任何列名。
具体实现代码
先拿你提供的小数据框做测试验证:
import pandas as pd # 你的测试数据 data = { '1_2': [1,4,8,4,8], '1_3': [5,3,8,3,0], '1_4': [2,4,8,4,7], '2_3': [8,5,9,4,4], '2_4': [2,8,3,8,2], '3_4': [2,5,3,3,2] } df = pd.DataFrame(data) # 1. 解析所有列名,得到每个列对应的元素对(比如"1_2" → (1,2)) column_pairs = [tuple(map(int, col.split('_'))) for col in df.columns] # 2. 提取所有唯一的原始元素(比如1、2、3、4) unique_elements = sorted({num for pair in column_pairs for num in pair}) # 3. 循环为每个元素生成f_i列 for i in unique_elements: # 筛选出所有列名中包含i的列 target_cols = [col for col, pair in zip(df.columns, column_pairs) if i in pair] # 按行求和,生成f_i列 df[f'f_{i}'] = df[target_cols].sum(axis=1) # 查看结果 print(df)
运行后会输出你想要的结果:
1_2 1_3 1_4 2_3 2_4 3_4 f_1 f_2 f_3 f_4 0 1 5 2 8 2 2 8 11 15 6 1 4 3 4 5 8 5 11 17 13 17 2 8 8 8 9 3 3 24 20 20 14 3 4 3 4 4 8 3 11 16 10 15 4 8 0 7 4 2 2 15 14 6 11
直接扩展到20个元素的场景
当你的数据框有20C2=190列时,这段代码完全不需要修改:
- 列名解析会自动处理所有
"i_j"格式的列; - 会自动提取出1~20的所有唯一元素;
- 自动生成
f_1到f_20这20个列,每个列都是对应元素所有组合列的行和。
可选优化:用正则快速筛选列
如果你的数据量特别大,还可以用正则表达式来更快地筛选包含元素i的列:
import re for i in unique_elements: # 正则规则:列名以i开头(比如"i_j")或结尾(比如"j_i") pattern = re.compile(rf'^{i}_|_{i}$') target_cols = df.columns[df.columns.str.match(pattern)] df[f'f_{i}'] = df[target_cols].sum(axis=1)
这个方法和之前的逻辑完全一致,只是筛选列的方式更高效,适合列数极多的场景。
备注:内容来源于stack exchange,提问作者Ishigami
相关产品推荐
相关产品推荐

