为什么在函数没有返回值时,pandas的 apply会返回NaN,而不是保留原来的值?
我正在尝试使用pandas DataFrame的 apply方法对一列进行转换,但有些元素返回NaN(或None),尽管我希望原始值保持不变。
下面是一个简化的代码片段,用来重现这个问题:
import pandas as pd
def scale_positive(x):
if x > 0:
return x * 10
# For x <= 0 I intentionally omitted a return statement,
# expecting the original value to be preserved.
s = pd.Series([5, -2, 0, 8, -1])
result = s.apply(scale_positive)
print(result)
实际输出:
1 NaN
2 NaN
3 80.0
4 NaN
dtype: float64
我期望输出是 [50, -2, 0, 80, -1]。相反,apply在没有显式返回值的元素处插入NaN(对象类型为None时会得到None)。
我已经阅读了 'apply' 的文档并做了一些实验。看起来当一个函数没有显式的 'return'(隐式返回None)时,'apply' 会把None(或NaN)放到结果单元中。为什么 'apply' 在这种情况下不能简单地保留原始值?在对Series或 DataFrame的部分元素进行条件性变换、而让其余部分保持不变时,最合适的用法是什么?
Python版本:3.11.6
pandas版本:2.1.1
操作系统:macOS Ventura
解决方案
我已经阅读了 'apply' 的文档并做了一些实验。看起来当一个函数没有显式的 'return'(隐式返回None)时,'apply' 会把None(或NaN)放到结果单元中。
你确实发现了问题所在。你的函数有时不返回值,因此在那些情况下结果是 None。
为什么 'apply' 在这种情况下不直接保留原始值?
我们可以对设计该功能时的任何潜在原因进行推测,但这并不改变功能的实际表现。
我个人的猜测很简单……为什么会这样?这听起来像是出乎意料的行为,可能带来比它解决的问题更多的问题。如果你希望通过函数调用得到一个值,那么该函数就应该返回该值。
在对Series或 DataFrame的部分元素进行条件性变换、同时让其他元素保持不变时,最合适的惯用方法是什么?
从你的函数中返回一个值。例如:
def scale_positive(x):
if x > 0:
return x * 10
return x
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。