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

Pandas如何根据其他列的二进制取值创建存储列名列表的新列

Pandas 新增列存储行内值为1的列名列表实现方案

问题场景

当前测试DataFrame结构如下:

Person  atrib1  atrib2  atrib3  atrib4
0  Paulo       0       1       0       1
1 Andres       1       1       0       1

需求为新增atrib_list列,每行存储该行内取值等于1的atrib类列的列名组成的列表,期望输出效果:

Person  atrib1  atrib2  atrib3  atrib4                atrib_list
0  Paulo       0       1       0       1         ['atrib2', 'atrib4']
1 Andres       1       1       0       1  ['atrib1', 'atrib2', 'atrib4']

你之前编写的代码存在三处核心逻辑错误:未指定按行遍历规则、判断逻辑未绑定当前行数据、没有筛选目标属性列范围,因此无法得到正确结果。

正确实现代码

# 第一步:先筛选出所有atrib开头的属性列,排除Person这类非目标列
atrib_columns = [col for col in df.columns if col.startswith('atrib')]

# 第二步:逐行判断属性列的值,收集值为1的列名转为列表
df['atrib_list'] = df[atrib_columns].apply(
    lambda row: row.index[row == 1].tolist(),
    axis=1  # 必须指定axis=1,代表按行遍历
)

代码说明

  • 提前筛选atrib开头的列,避免后续表结构新增其他列时把无关列名加入结果
  • 指定axis=1让apply逐行传入行Series对象,row ==1会返回当前行每个位置是否等于1的布尔序列,用这个布尔序列筛选行索引(也就是列名)再转成列表即可
  • 该写法在万级以内数据量下性能足够,如果是十万级以上超大数据集,可以换用numpy向量化写法进一步提速,常规业务场景用上面的代码完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:30:09