You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动