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

Pandas如何高效创建行非空值对应列名组成的数组类型新列

高效实现方案

你可以用Pandas的向量化操作替代iterrows()循环,性能提升可达百倍以上,以下是两种常用实现:

方案1:dot矩阵运算(性能最优,适合大数据量)

这是目前性能最高的写法,完全规避了逐行遍历,核心思路是通过布尔矩阵和列名的矩阵拼接直接得到结果:

import pandas as pd
import numpy as np

# 构造测试数据
df = pd.DataFrame({
    'List1': [np.nan]*5,
    'List2': [np.nan]*5,
    'List3': [1]*5,
    'List4': [np.nan]*5,
    'List5': [np.nan, np.nan, 1, np.nan, 1],
    'List6': [np.nan]*5,
    'List7': [1]*5,
    'List8': [np.nan]*5
})

# 核心代码
sep = ',' # 可替换为其他不会出现在列名中的分隔符
df['Lists'] = df.notna().dot(df.columns + sep).str.rstrip(sep).str.split(sep)

运行后得到的Lists列完全符合你的预期。

方案2:apply行遍历(可读性高,适合中小数据量)

如果你的数据量在万行级别,不需要极致性能,可以用更易懂的apply写法,性能也远高于iterrows():

df['Lists'] = df.apply(lambda row: list(row.dropna().index), axis=1)

注意事项

如果你的列名本身包含逗号,只需要把分隔符sep换成其他不会出现在列名中的字符(比如|、#等)即可。

内容的提问来源于stack exchange,提问作者Hassan Syyid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 14:36:04