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

如何在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)

代码解释

  1. 映射规则定义:用字典suffix_map明确后缀和对应数值的关系,后续可以轻松扩展更多后缀类型。
  2. 前缀分组:通过rsplit('_',1)拆分列名,自动把相同前缀的列归为一组,不需要手动指定每组列名,完全适配任意数量的前缀组。
  3. 列值映射与聚合:
    • 对每个列,把yes映射为后缀对应的数值,no映射为0,NaN保持不变;
    • 对同一前缀组的映射结果按行求和:因为sum默认会忽略NaN,如果一行全是NaN则返回NaN,刚好符合规则;如果有yes和no并存,yes的数值加0就是最终结果,完美匹配示例中的情况。
  4. 提取最终结果:筛选出所有_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:45:12