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

Pandas中如何提取每行值为1的对应列名拼接生成新列

pandas生成行内值为1的列名拼接列的实现方法

你可以直接用行级apply快速实现需求,代码逻辑简单可读性高,适合绝大多数常规数据量场景:

import pandas as pd
import numpy as np

# 构造测试数据集
df = pd.DataFrame({'a':[1,0,1],'b':[1,1,np.nan],'c':[1,1,1]})

# 生成目标d列
df['d'] = df.apply(lambda x: ';'.join(x[x == 1].index), axis=1)

代码逻辑说明

  • 传入axis=1参数让apply按行遍历,每一行的Series对象会传入lambda函数处理
  • x[x == 1]会自动筛选当前行中值严格等于1的元素,自动跳过0、空值np.nan等不符合条件的内容
  • 取筛选后元素的index也就是对应列名,用分号join拼接成目标字符串即可

运行后输出的df和预期结果完全一致:

a    b  c      d
0  1  1.0  1  a;b;c
1  0  1.0  1    b;c
2  1  NaN  1    a;c

大数据量优化方案

如果你的数据集规模在百万行以上,apply的逐行遍历效率偏低,可以用纯向量化的矩阵乘法实现,性能比apply高数十倍:

df['d'] = (df.eq(1) @ (df.columns + ';')).str.rstrip(';')

实现逻辑:

  1. 用df.eq(1)生成全量布尔判断矩阵,值为1的位置标记为True,其余为False
  2. 布尔矩阵和带分号后缀的列名数组做矩阵点乘,会自动把True位置对应的列名拼接为字符串,每个列名后自带分号
  3. 最后用字符串方法去掉末尾多余的分号即可,全程走pandas底层C实现,没有Python层循环开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:21:21