如何在Pandas DataFrame中按条件填充符合要求的列名至新列
解决DataFrame新增列收集所有符合条件列名的问题
你当前的循环写法存在一个关键问题:每次执行df.loc[df[col] > 1, 'd'] = col时,会覆盖掉之前已经赋值的行的d列值,所以最终只会保留最后一个满足条件的列名,而不是把所有符合条件的列名都收集起来。
下面给你两种高效的解决方法,都能得到你想要的期望输出:
方法一:使用apply逐行筛选拼接
这种方法直观易懂,直接按行处理,筛选出当前行中值大于1的列名,再用逗号连接:
import pandas as pd # 初始化你的DataFrame df = pd.DataFrame([ [1, 0, 2, 2], [1, 1, 0, 0], [0, 2, 3, 2], [2, 2, 1, 1]], columns=['col1', 'col2', 'col3', 'col4']) cols = df.columns[:-1] # 新增列d:收集所有值>1的列名,用逗号分隔 df['d'] = df[cols].apply(lambda row: ','.join(row[row > 1].index), axis=1) print(df)
代码解释:
axis=1指定按行进行处理row[row > 1]会筛选出当前行中值大于1的元素.index获取这些元素对应的列名','.join()把列名列表拼接成字符串,如果没有符合条件的列,会自动返回空字符串
方法二:基于布尔矩阵筛选列名
先生成一个布尔矩阵记录每个位置是否满足条件,再根据布尔值筛选列名:
import pandas as pd df = pd.DataFrame([ [1, 0, 2, 2], [1, 1, 0, 0], [0, 2, 3, 2], [2, 2, 1, 1]], columns=['col1', 'col2', 'col3', 'col4']) cols = df.columns[:-1] # 生成布尔矩阵:每个元素标记对应列的值是否>1 bool_matrix = df[cols] > 1 # 逐行筛选布尔值为True的列名,拼接成字符串 df['d'] = bool_matrix.apply(lambda x: ','.join(cols[x]), axis=1) print(df)
代码解释:
bool_matrix是一个和df[cols]形状相同的DataFrame,值为True表示对应位置满足>1的条件cols[x]会筛选出当前行中布尔值为True的列名- 同样用
','.join()完成拼接
运行任意一种方法后,你都会得到期望的输出:
col1 col2 col3 col4 d 0 1 0 2 2 col3 1 1 1 0 0 2 0 2 3 2 col2,col3 3 2 2 1 1 col1,col2
内容的提问来源于stack exchange,提问作者ltyrvol




