You need to enable JavaScript to run this app. 如何根据pandas DataFrame两列条件创建新列First Name?
优惠活动
大模型
产品
解决方案
定价
更多

如何根据pandas DataFrame两列条件创建新列First Name?

基于两列条件生成新列的实现方案

原代码的问题根因

你之前的写法存在两处核心逻辑错误,直接导致输出不符合预期:

  • 用x['Name1'] is True做有效性判断:is是判断对象内存地址同一性,而非值是否有效,且字符串类型的Name1值永远不可能和布尔值True地址相等,判断逻辑从根上不成立
  • 错误的判断逻辑在DataFrame广播机制下,会让整列的判断结果统一为同一个值,最终出现“First Name列全取Name1或全取Nickname”的异常情况

提示:所有有效性判断识别的是pandas原生缺失值(NaN/NA),如果列内的空标记是字符串形式的"Nan",需要先通过df['列名'] = df['列名'].replace('Nan', pd.NA)转换为真实缺失值,再执行后续逻辑。

可行实现方案

方案1:内置combine_first方法(性能最优、代码最简洁)

该方法的原生逻辑完全匹配需求:优先取调用列的非空有效值,遇到空值时自动取传入列的对应位置值,是这类场景下的最优写法:

import pandas as pd
df['First Name'] = df['Name1'].combine_first(df['Nickname'])

方案2:df.loc定位更新(逻辑直观易理解)

按照你之前了解到的loc用法,先给新列设置默认值,再定位有效行做替换即可:

# 先给新列设置默认值为Nickname列的内容
df['First Name'] = df['Nickname']
# 生成Name1非空的行过滤掩码
valid_name_mask = df['Name1'].notna()
# 对符合掩码的行,将First Name替换为对应Name1的值
df.loc[valid_name_mask, 'First Name'] = df.loc[valid_name_mask, 'Name1']

方案3:修正版apply逐行遍历写法

如果需要逐行判断的灵活逻辑,只需要把原来错误的判断条件换成pd.notna()的有效值判断即可:

df['First Name'] = df.apply(
    lambda row: row['Name1'] if pd.notna(row['Name1']) else row['Nickname'],
    axis=1
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 04:36:02