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

