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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:21:04