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

如何按行缩减Pandas DataFrame,提取True值对应列名

解决方法:将DataFrame行转为True对应列名的数组

这问题我之前处理类似需求时也碰到过,其实不用纠结lambda里绑定外部变量的问题,有几种简洁高效的方法能直接实现你的需求:

方法一:使用apply结合行Series的索引

这是最直观的方法,利用apply按行处理,每一行作为一个Series,直接筛选出值为True的元素对应的列名:

import pandas as pd
import numpy as np

# 构造原DataFrame
df = pd.DataFrame(np.array([[True,False], [True,True], [False,True]]),columns=['x','y'])

# 生成目标列
df['z'] = df.apply(lambda row: row[row].index.tolist(), axis=1)

# 提取需要的结果DataFrame
df_out = df[['z']]

原理说明:

  • 设置axis=1时,apply会逐行处理,lambda的参数row是当前行的Series对象
  • row[row]会自动筛选出当前行中值为True的元素
  • 再通过.index获取这些元素对应的原列名,最后用.tolist()转成列表格式

方法二:矢量化遍历(更高效,适合大数据集)

如果你的DataFrame行数很多,apply的效率会偏低,推荐用这种基于数组的矢量化方法,直接操作底层的数值数组:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.array([[True,False], [True,True], [False,True]]),columns=['x','y'])

# 遍历每行布尔值数组,索引列名生成列表
df_out = pd.DataFrame({
    'z': [df.columns[row].tolist() for row in df.values]
})

原理说明:

  • df.values返回原DataFrame的二维布尔数组,遍历每一行的布尔值
  • 用布尔行数组直接索引df.columns,就能得到当前行所有True对应的列名
  • 最后将这些列名转成列表,构造成新的DataFrame

关于你之前的困惑:

你提到无法在lambda中访问原DataFrame的列,其实根本不需要特意绑定外部变量——不管是用方法一中的行Series索引,还是方法二中直接调用df.columns,都能轻松获取到原列名,不用额外做绑定操作~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:28:13