Pandas如何提取每行值大于0的列名并拼接为新列
解决思路与实现代码
该方案无需手动指定列名,自动适配任意列数的DataFrame场景。
完整可运行代码
import pandas as pd # 示例数据可根据实际需求替换 dic2 = {'a':[0,11,12],'b':[23,43,0],'c':[11,33,12],'d':[0,22,0]} df = pd.DataFrame(dic2) # 核心逻辑:按行遍历,筛选出值大于0的列名后用逗号拼接 df['e'] = df.apply(lambda row: ','.join(row.index[row > 0]), axis=1) print(df)
代码逻辑说明
apply(axis=1)表示对DataFrame按行进行遍历处理,每次遍历拿到的row是代表当前行的Series对象,其index就是原DataFrame的列名row.index[row > 0]会筛选出当前行中值大于0的所有列名- 用
','.join()把筛选出来的列名拼接成字符串,赋值给新列e
基于你现有尝试的兼容写法
你已经写出了df[df>0]将0值替换为NaN的结果,基于这个结果也可以实现需求,写法如下:
df_temp = df[df>0] df['e'] = df_temp.apply(lambda row: ','.join(row.dropna().index), axis=1)
更高性能的实现方案(适合大数据量场景)
避免逐行循环的性能损耗,使用向量化运算提速:
# gt(0)等价于df>0,得到布尔矩阵,和加了逗号的列名矩阵相乘,最后去掉末尾多余的逗号 df['e'] = df.gt(0).dot(df.columns + ',').str.rstrip(',')
内容的提问来源于stack exchange,提问作者Vesper
相关产品推荐
相关产品推荐

