Pandas DataFrame中对列应用函数时跳过NaN值的问题
解决Pandas中处理含NaN列的自定义函数应用问题
问题场景
原始数据:
| Confianza |
|---|
| 2.0 |
| 4.0 |
| 7.0 |
| NaN |
预期输出:
| Confianza |
|---|
| Baja |
| Media |
| Alta |
| NaN |
需求:对Confianza列按规则映射文本标签,同时保留原有的NaN值(不删除对应行)。
现有代码尝试添加NaN判断时,触发错误:The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().,错误代码片段:
elif ( df5['Confianza'] != notnull): return NaN
错误原因
- NaN判断方式错误:
notnull是Pandas的全局函数,不能直接用!= notnull判断单个值是否为NaN,正确方式是用pd.isna()或np.isnan()。 - 行处理逻辑错误:
apply(axis=1)是逐行传入单行数据(Series),但代码中仍用df5['Confianza']引用整列,导致返回布尔Series,触发歧义错误。
解决方案
方法1:修正自定义逐行处理函数
先导入依赖库,然后调整函数逻辑,优先判断NaN:
import pandas as pd def condiciones(row): # 先判断当前行的Confianza是否为NaN if pd.isna(row['Confianza']): return pd.NA elif row['Confianza'] > 4: return "Alta" elif row['Confianza'] == 4: return "Media" else: return "Baja" # 应用函数到列 df5['Confianza'] = df5.apply(condiciones, axis=1)
方法2:用np.select实现高效映射(推荐)
对于数值区间映射场景,np.select比apply效率更高,且天然保留NaN:
import pandas as pd import numpy as np # 定义映射条件和对应标签 conditions = [ df5['Confianza'] > 4, df5['Confianza'] == 4, df5['Confianza'] < 4 ] choices = ['Alta', 'Media', 'Baja'] # 执行映射,不满足条件的(含NaN)返回默认值pd.NA df5['Confianza'] = np.select(conditions, choices, default=pd.NA)
方法3:用pd.cut实现区间划分
适合连续数值的区间映射,通过参数配置匹配需求:
import pandas as pd # 先备份原始数值列,避免覆盖后无法判断等于4的情况 df5['Confianza_original'] = df5['Confianza'] # 定义区间边界和标签,right=False表示左闭右开 df5['Confianza'] = pd.cut( df5['Confianza_original'], bins=[-float('inf'), 4, float('inf')], labels=['Baja', 'Alta'], right=False ) # 单独处理等于4的情况 df5.loc[df5['Confianza_original'] == 4, 'Confianza'] = 'Media' # 可选:删除备份列 df5.drop('Confianza_original', axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者SERGIO
相关产品推荐
相关产品推荐

