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

如何为DataFrame新增key_name列,填入符合code行条件的列名?

给DataFrame新增'key_name'列的实现方法

我来帮你搞定这个需求,咱们一步步拆解来做:

首先明确核心规则:给现有DataFrame新增一列key_name,要求:

  • 除code行外,每行找同时满足两个条件的列:该行该列值为1,且code行对应列值也为1
  • 找到符合条件的列就填入列名,找不到填nan
  • code行本身的key_name直接填nan

方法一:用apply逐行处理(直观易懂,适合小数据集)

假设你的DataFrame变量名为df,代码如下:

import pandas as pd

# 第一步:提取code行中值为1的列的掩码(标记哪些列是有效候选)
code_mask = df.loc['code'] == 1

# 第二步:定义处理每行的函数
def get_key_name(row):
    # 跳过code行,直接返回空值
    if row.name == 'code':
        return pd.NA
    # 筛选当前行中满足条件的列名
    matched_columns = row[(row == 1) & code_mask].index
    # 有匹配列就取最后一个(和你例子里行4的结果一致;要取第一个就换[0])
    return matched_columns[-1] if len(matched_columns) > 0 else pd.NA

# 第三步:新增key_name列
df['key_name'] = df.apply(get_key_name, axis=1)

方法二:向量化处理(效率更高,适合大数据集)

如果你的数据量较大,逐行处理会偏慢,推荐用向量化方法提升速度:

import pandas as pd

# 提取code行的有效列掩码
code_mask = df.loc['code'] == 1

# 生成布尔矩阵,标记每个位置是否满足双条件
matches = (df == 1) & code_mask

# 找到每行最后一个匹配的列名,无匹配则填NA
df['key_name'] = matches.idxmax(axis=1).where(matches.any(axis=1), pd.NA)

# 单独设置code行的key_name为NA
df.loc['code', 'key_name'] = pd.NA

结果说明

运行代码后就能得到你期望的结果:

  • 行1的Q111满足双条件,key_name为Q111
  • 行2的Q570、Q7891虽为1,但code行对应列是0,所以返回nan
  • 行3的Info583按规则应该返回列名,你给出的期望结果是nan可能是笔误,可根据实际需求调整逻辑
  • 行4的Q111和Info583都满足条件,代码取最后一个,所以key_name为Info583,和你的例子一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:06:51