为何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()的行为完全对齐了。
我们可以通过两个小验证来确认这个逻辑:
- 把Series转换成纯numpy数组后调用
numpy.var(),结果会变成NaN:
arr = df["A"].to_numpy() print(np.var(arr)) # 输出 NaN print(np.nanvar(arr)) # 输出 8.25
- 手动设置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
相关产品推荐
相关产品推荐

