如何在Pandas中按列名前缀分组、转换值并批量生成聚合列?
通用解决方案:批量生成带_all后缀的聚合列
这里有一个灵活通用的方案,不管你有多少组前缀列,都能自动处理生成目标列,完全匹配你给出的规则:
完整可运行代码
import numpy as np import pandas as pd # 原始DataFrame df = pd.DataFrame({ 'x_d_a_b_1to3': [np.NaN, 'yes', 'yes', 'no'], 'x_d_a_b_lessthanhalf': ['no', 'no', 'no', np.NaN], 'y_k_d_e_lessthanhalf': ['no', 'yes', 'no', np.NaN], 'y_k_d_e_1to3': ['yes', 'no', 'no', np.NaN], 'id': [1, 2, 3, 4] }) # 1. 定义后缀到数值的映射规则 suffix_map = {'1to3': 2, 'lessthanhalf': 0.5} # 2. 按前缀分组列名(排除id列) prefix_groups = {} for col in df.columns: if col == 'id': continue # 提取前缀:去掉最后一个下划线后的部分 prefix = col.rsplit('_', 1)[0] if prefix not in prefix_groups: prefix_groups[prefix] = [] prefix_groups[prefix].append(col) # 3. 批量生成每个前缀对应的_all列 for prefix, cols in prefix_groups.items(): temp_columns = [] for col in cols: # 获取当前列的后缀 suffix = col.rsplit('_', 1)[1] # 映射单元格值:yes→对应数值,no→0,NaN保持 mapped_col = df[col].map({'yes': suffix_map[suffix], 'no': 0}) temp_columns.append(mapped_col) # 合并临时列并按行求和:全NaN时返回NaN,否则取有效数值的和(匹配规则) df[f'{prefix}_all'] = pd.concat(temp_columns, axis=1).sum(axis=1) # 4. 提取最终目标列(所有_all列 + id) final_df = df[[col for col in df.columns if col.endswith('_all')] + ['id']] print(final_df)
代码解释
- 映射规则定义:用字典
suffix_map明确后缀和对应数值的关系,后续可以轻松扩展更多后缀类型。 - 前缀分组:通过
rsplit('_',1)拆分列名,自动把相同前缀的列归为一组,不需要手动指定每组列名,完全适配任意数量的前缀组。 - 列值映射与聚合:
- 对每个列,把
yes映射为后缀对应的数值,no映射为0,NaN保持不变; - 对同一前缀组的映射结果按行求和:因为
sum默认会忽略NaN,如果一行全是NaN则返回NaN,刚好符合规则;如果有yes和no并存,yes的数值加0就是最终结果,完美匹配示例中的情况。
- 对每个列,把
- 提取最终结果:筛选出所有
_all后缀的列和id列,得到目标DataFrame。
输出结果
运行代码后会得到你想要的最终DataFrame:
x_d_a_b_all y_k_d_e_all id 0 0.0 2.0 1 1 2.0 0.5 2 2 2.0 0.0 3 3 0.0 NaN 4
内容的提问来源于stack exchange,提问作者quant
相关产品推荐
相关产品推荐

