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

如何在Pandas DataFrame中从指定3列提取非空数据建列并解决KeyError

解决DataFrame从多列提取非空值创建新列的问题

错误原因

你遇到的KeyError: ('d', 'f', 'g')是因为pandas选取多列的语法错误:

  • 单层方括号df['列名']只能用于选取单列或者行切片;
  • 选取多列必须用双层方括号df[['列1', '列2', '列3']],你的代码里少了一层括号,导致pandas把('d','f','g')当成单个列名去查找,自然找不到报错。

正确实现方案

根据你“提取3列中的非空数据填充新列”的需求,分两种常见场景给出代码:

场景1:每行仅存在一个非空值

如果目标三列里每行只有一个有效非空值,用bfill或ffill快速提取:

# 取每行从左到右第一个非空值(d→f→g的优先级)
df['color'] = df[['d', 'f', 'g']].bfill(axis=1).iloc[:, 0]

# 若需要从右到左取第一个非空值(g→f→d的优先级),改用ffill:
# df['color'] = df[['d', 'f', 'g']].ffill(axis=1).iloc[:, 0]

场景2:需要结合数值判断(对应你原代码里的逻辑)

如果还要保留“数值≥0转int,否则返回'Nope'”的逻辑,用apply逐行处理:

def extract_color(row):
    # 过滤当前行的空值
    valid_vals = row.dropna()
    if valid_vals.empty:
        return None  # 无有效值时返回None,可改成你需要的默认值
    first_val = valid_vals.iloc[0]
    # 执行数值判断逻辑
    return int(first_val) if first_val >= 0 else 'Nope'

# 对目标三列应用函数,axis=1表示逐行处理
df['color'] = df[['d', 'f', 'g']].apply(extract_color, axis=1)

验证说明

把原代码里的df['d', 'f', 'g']改成df[['d', 'f', 'g']]后,KeyError会直接消失,再结合上面的逻辑就能实现你要的新列效果。

内容的提问来源于stack exchange,提问作者Roberto Mulé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:42:55