如何按行缩减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
相关产品推荐
相关产品推荐

