Pandas多条件判断生成新列时np.nan无法正确返回的问题求解
问题根因
你两个方案出错的核心原因是**np.nan不能用==做等值判断**,np.nan和任意值(包括它自己)做==比较都会返回False,必须用pd.isna()或np.isnan()来判断空值。
最优解决方案(向量化运算,性能远高于apply)
# 先判断行内A、B是否存在空值,有空值直接返回np.nan,否则按比较逻辑返回对应值 df['is_less'] = np.where( df[['A', 'B']].isna().any(axis=1), np.nan, np.where(df['B'] < df['A'], 'yes', 'no') )
如果你习惯用自定义函数的写法,可以修改你的方案2如下
def reduced_growth(x): # 改用pd.isna判断空值 if pd.isna(x['A']) or pd.isna(x['B']): return np.nan elif x['B'] < x['A']: return "yes" # 排除空值和B<A的场景后,剩下的都是B>=A,直接返回no即可,不需要额外判断 else: return "no" df['is_less'] = df.apply(reduced_growth, axis=1)
原方案错误说明
- 方案1中
df['A'] == np.nan所有行都返回False,空值行的is_less不会被赋值为np.nan - 方案2同理,
x['A'] == np.nan永远不成立,永远走不到返回np.nan的分支,所以不会出现空值结果
内容的提问来源于stack exchange,提问作者brenda89
相关产品推荐
相关产品推荐

