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

为何Pandas的apply方法在函数无return语句时返回NaN而非保留原值?附条件转换的规范实现方式

Pandas apply返回NaN的原因及条件转换正确姿势

嘿,我来帮你拆解这个问题:

为什么apply会填NaN而不是保留原值?

核心原因其实和Python本身的函数规则有关——你的scale_positive函数在x <= 0时没有写return语句,这时候Python会隐式返回None。而Pandas的apply是个“老实人”,它只会严格把函数的返回值对应放到结果里:

  • 对于数值类型的Series,None会被转换成NaN(因为数值类型没法存None)
  • 如果是object类型的Series,就会直接保留None

Pandas不会去“猜”你是不是想保留原值,毕竟函数没返回东西的情况,可能是你真的要空值,也可能是忘了写return,所以它只能遵循Python的规则来处理。

条件转换+保留原值的规范做法

这里有几种常用的方案,挑适合你场景的用:

1. 补全函数的return语句(最直观不易错)

直接在函数里明确返回原值,这是最清晰的写法,别人看代码也一眼能懂:

import pandas as pd
def scale_positive(x):
    if x > 0:
        return x * 10
    return x  # 显式返回原始值

s = pd.Series([5, -2, 0, 8, -1])
result = s.apply(scale_positive)
print(result)

输出完全符合你的预期:

0    50
1    -2
2     0
3    80
4    -1
dtype: int64

2. 用numpy.where(高效简洁,适合简单条件)

如果你的逻辑比较简单,没必要写自定义函数,用numpy.where速度更快(处理大数据集时优势明显):

import pandas as pd
import numpy as np

s = pd.Series([5, -2, 0, 8, -1])
# 语法:np.where(条件, 满足条件时的值, 不满足条件时的值)
result = np.where(s > 0, s * 10, s)
print(result)

也可以用Pandas原生的where方法,注意参数顺序刚好相反(不满足条件时替换):

result = s.where(s <= 0, s * 10)

3. 用Pandas的mask方法(语义清晰)

mask方法的逻辑是:满足条件的元素替换成指定值,不满足的保留原值,完美匹配你的需求:

import pandas as pd

s = pd.Series([5, -2, 0, 8, -1])
result = s.mask(s > 0, s * 10)
print(result)

4. 用lambda+map(简洁的单行写法)

如果逻辑简单,也可以用map配合lambda表达式,写法更紧凑:

import pandas as pd

s = pd.Series([5, -2, 0, 8, -1])
result = s.map(lambda x: x * 10 if x > 0 else x)
print(result)

内容的提问来源于stack exchange,提问作者Джон Сноу

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 09:23:11