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

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

错误原因

  1. NaN判断方式错误:notnull是Pandas的全局函数,不能直接用!= notnull判断单个值是否为NaN,正确方式是用pd.isna()或np.isnan()。
  2. 行处理逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:25:31