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

pandas DataFrame如何将值为1的对应列名拼接为逗号分隔字符串列

按行提取DataFrame值为1的列名拼接字符串的实现方案

核心需求:遍历DataFrame每一行,收集该行中数值等于1的所有列名,拼接为以逗号+空格分隔的字符串,作为新列CombinedString写入原表。

方法1:逐行apply遍历

逻辑直观理解成本低,适合列数不多、数据规模中小的场景:

  1. 构造示例数据源
    import pandas as pd
    
    df = pd.DataFrame({
        "Male": [0, 1, 0],
        "Over18": [0, 1, 0],
        "Single": [1, 1, 1]
    })
    
  2. 逐行匹配拼接规则
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 10:36:04