如何在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
相关产品推荐
相关产品推荐

