如何在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é
相关产品推荐
相关产品推荐

