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(';')
实现逻辑:
- 用
df.eq(1)生成全量布尔判断矩阵,值为1的位置标记为True,其余为False - 布尔矩阵和带分号后缀的列名数组做矩阵点乘,会自动把True位置对应的列名拼接为字符串,每个列名后自带分号
- 最后用字符串方法去掉末尾多余的分号即可,全程走pandas底层C实现,没有Python层循环开销。
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

