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

如何在pandas DataFrame中新增列,按行收集值非0的列名存入新列

解决方案

不要用逐行遍历的写法,不仅代码冗余,运行效率也很低,pandas有内置的简洁实现方案:

方法1:apply实现(适合中小数据集,逻辑直观易维护)

import pandas as pd

# 构造示例DF,你可以替换成自己的数据源
df = pd.DataFrame({
    'chicken': [0, 0.4, 0.2, 0],
    'cow': [0, 0.2, 0, 0],
    'moose': [0, 0, -0.2, 0],
    'goat': [0.2, 0, 0.1, 0],
    'pigeon': [0, 0, 0.3, 0]
})

# 核心实现代码
df['new_column'] = df.apply(lambda row: row[row != 0].index.tolist(), axis=1)

方法2:向量化dot实现(适合百万级以上大数据集,性能远高于apply)

# 生成非0值的布尔掩码
mask = df != 0
# 拼接列名后拆分转列表
df['new_column'] = mask.dot(df.columns + ',').str.rstrip(',').str.split(',').replace('', [])

注意事项

如果你的原始数据中存在NaN值,可以根据需求调整判断逻辑:

  • 需要把NaN视为0:将判断条件修改为row.fillna(0) != 0
  • 需要把NaN视为非0值:将判断条件修改为row.notna() & (row != 0)

运行后输出的结果和你给出的示例完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:09:04