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

为何numpy.var与numpy.nanvar处理Pandas数据时表现一致?

为什么numpy.var()/std()和numpy.nanvar()/nanstd()处理Pandas DataFrame列时结果一致?

这确实是个有意思的现象!通常情况下,numpy.var()和numpy.nanvar()(以及numpy.std()和numpy.nanstd())的行为差异很明确:

  • numpy.var()/numpy.std()在遇到NaN值时会直接返回NaN,因为它们不会跳过缺失值
  • numpy.nanvar()/numpy.nanstd()会自动忽略NaN值,计算有效数据的方差/标准差

但在你的测试场景里,处理Pandas DataFrame的列(本质是Pandas Series对象)时,两组函数的结果完全一致,核心原因在于Pandas的Series对象实现了__array_function__接口:当你把Series传给numpy的这些统计函数时,numpy会转而调用Pandas自己的对应方法,而Pandas的var()和std()方法默认开启skipna=True——也就是自动忽略NaN值,这就和numpy.nanvar()/numpy.nanstd()的行为完全对齐了。

我们可以通过两个小验证来确认这个逻辑:

  1. 把Series转换成纯numpy数组后调用numpy.var(),结果会变成NaN:
arr = df["A"].to_numpy()
print(np.var(arr))  # 输出 NaN
print(np.nanvar(arr))  # 输出 8.25
  1. 手动设置Pandas的skipna=False,调用Series的var()方法,结果也会是NaN:
print(df["A"].var(skipna=False))  # 输出 NaN

你的测试代码与结果

测试代码

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': [1,2,3,4,5,6,7,8,9,10,np.NaN,np.NaN,np.NaN]})
print("np.var() " + " : "+ str(np.var(df["A"])))
print("np.nanvar() " + " : "+ str(np.nanvar(df["A"])))
print("np.std() " + " : "+ str(np.std(df["A"])))
print("np.nanstd() " + " : "+ str(np.nanstd(df["A"])))

测试结果

np.var() : 8.25
np.nanvar() : 8.25
np.std() : 2.8722813232690143
np.nanstd() : 2.8722813232690143

简单总结:numpy对Pandas对象做了适配,调用了Pandas自带的、默认跳过缺失值的统计方法,所以最终结果和专门处理NaN的numpy函数完全一致。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:23:16