pandas DataFrame如何将值为1的对应列名拼接为逗号分隔字符串列
按行提取DataFrame值为1的列名拼接字符串的实现方案
核心需求:遍历DataFrame每一行,收集该行中数值等于1的所有列名,拼接为以逗号+空格分隔的字符串,作为新列CombinedString写入原表。
方法1:逐行apply遍历
逻辑直观理解成本低,适合列数不多、数据规模中小的场景:
- 构造示例数据源
import pandas as pd df = pd.DataFrame({ "Male": [0, 1, 0], "Over18": [0, 1, 0], "Single": [1, 1, 1] }) - 逐行匹配拼接规则
def build_combined(row): return ', '.join(row[row == 1].index) df["CombinedString"] = df.apply(build_combined, axis=1)
方法2:numpy向量化定位
规避逐行循环的Python层开销,数据量达到十万行以上时性能远高于apply写法:
import numpy as np # 定位所有值等于1的元素的行、列坐标 row_pos, col_pos = np.where(df == 1) # 逐行匹配列名完成拼接 df["CombinedString"] = [ ', '.join(df.columns[col_pos[row_pos == row_id]]) for row_id in range(len(df)) ]
方法3:stack长表转换
pandas原生链式写法,逻辑紧凑易调试:
df["CombinedString"] = ( df.stack() .loc[lambda s: s == 1] .groupby(level=0) .apply(lambda s: ', '.join(s.index.get_level_values(1))) )
输出效果验证
三种方法执行完成后,生成的DataFrame完全符合预期:
Male Over18 Single CombinedString 0 0 0 1 Single 1 1 1 1 Male, Over18, Single 2 0 0 1 Single
注意:如果某一行所有列取值都为0,对应拼接结果会是空字符串,可直接适配业务逻辑,无需额外异常处理。
内容的提问来源于stack exchange,提问作者nicklasc93
相关产品推荐
相关产品推荐

