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

