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

如何基于DataFrame多列非NaN值生成MasterID新列?

解决DataFrame中生成MasterID列的问题

你的问题出在判断NaN的方式上——你用了和字符串'nan'比较,但DataFrame里的空值是numpy的特殊值np.nan,不是字符串类型的'nan',这导致你的条件判断逻辑完全错误,最终后面的ID2赋值覆盖了前面的ID1结果。

正确的实现方法有这几种,都能满足你的需求:

方法1:使用combine_first(最简洁)

这个方法会优先取ID1的值,如果ID1是NaN,就取ID2的值,完美匹配你的需求:

import pandas as pd
import numpy as np

# 创建原始数据
df = pd.DataFrame({
    'ID1': ['Apple', 'Orange', np.nan, np.nan],
    'ID2': [np.nan, np.nan, 'Pear', 'Grape']
})

# 生成MasterID列
df['MasterID'] = df['ID1'].combine_first(df['ID2'])

方法2:使用fillna

和combine_first效果一致,本质是用ID2填充ID1的空值:

df['MasterID'] = df['ID1'].fillna(df['ID2'])

方法3:使用np.where显式判断

如果你需要更直观的条件逻辑,可以用numpy的where函数,明确指定判断规则:

df['MasterID'] = np.where(df['ID1'].notna(), df['ID1'], df['ID2'])

为什么你的原代码失效?

原代码里的df['ID1'] != 'nan'是把每个元素和字符串'nan'做比较,但实际的np.nan和任何值(包括字符串'nan')比较都会返回True(因为NaN不等于任何东西),所以第一个loc会把所有行的MasterID设为ID1的值;紧接着第二个loc的df['ID2'] != 'nan'同样对所有行成立,又把所有行的MasterID覆盖成ID2的值,最终结果就不符合预期了。

用上面的方法运行后,你会得到期望的结果:

ID1    ID2 MasterID
0    Apple    nan    Apple
1   Orange    nan   Orange
2      nan   Pear     Pear
3      nan  Grape    Grape

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:23:27