gpt4 book ai didi

python - nanfunctions 和常规函数在 Pandas 类型上表现相同

转载 作者:太空狗 更新时间:2023-10-30 00:53:10 29 4
gpt4 key购买 nike

通常 numpy.var() 不同于 numpy.nanvar() 当存在缺失值时,对于 numpy.std()numpy.nanstd()。然而:

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

为什么两者相同? np.var()np.std() 的文档中没有关于缺失值的内容。

最佳答案

这是因为 numpy.std (resp. numpy.var) 试图委托(delegate)给第一个参数的 std (resp. var) 方法,如果它不是 ndarray(来自 source code here ):

def std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):
kwargs = {}
if keepdims is not np._NoValue:
kwargs['keepdims'] = keepdims

if type(a) is not mu.ndarray:
try:
std = a.std
except AttributeError:
pass
else:
return std(axis=axis, dtype=dtype, out=out, ddof=ddof, **kwargs)

return _methods._std(a, axis=axis, dtype=dtype, out=out, ddof=ddof,
**kwargs)

实际上,您只是在调用 pandas.Series.std (自由度为 0)。在 Pandas 库中,所有描述性统计函数都处理缺失值(来自文档,请参见 Calculations with missing data)。

这里的要点是,假设您有一个 Pandas 系列,那么首先使用 Pandas 数据类型方法而不是 NumPy 自由函数要清楚得多。


评论

这种行为是 NumPy 对许多将类数组对象作为第一个参数的函数所做的 - 如果对象存在,请尝试对其使用相同的方法,如果不存在,则使用一些后备方法。但情况并非总是如此 - 例如

>>> a = np.random.randint(0, 100, 5)

>>> a
array([49, 68, 93, 51, 94])

>>> np.sort(a) # not in-place
array([49, 51, 68, 93, 94])

>>> a
array([49, 68, 93, 51, 94])

>>> a.sort() # in-place

>>> a
array([49, 51, 68, 93, 94])

此外,在大多数情况下,nanfunctions.py 中的 NaN 处理函数首先调用 _replace_nan,它将您的类型转换为一个 ndarray,并将您的 ndarray 中的 NaN 值替换为一个不会影响它们正在执行的任何计算的值(即 np.nansum 将 NaN 替换为 0,np.nanprod 将 NaN 替换为 1)。然后他们调用非 NaN 对象来执行实际计算。 (例如:np.nansum)

def nansum(a, axis=None, dtype=None, out=None, keepdims=np._NoValue):
a, mask = _replace_nan(a, 0)
return np.sum(a, axis=axis, dtype=dtype, out=out, keepdims=keepdims)

例如,在 Pandas 系列上调用 np.nansum,您实际上并没有最终使用 pandas.Series.sum,因为系列被转换为 ndarray首先在 _replace_nan 中。所以不要(我不确定你为什么会)假设或依赖调用你的系列的 sum 方法。

# a silly example

>>> s = pd.Series([1, 2, 3, np.nan])

>>> s.sum = lambda *args, **kwargs: "instance sum"

>>> s.sum()
'instance sum'

>>> np.sum(s)
'instance sum'

>>> np.nansum(s)
6

关于python - nanfunctions 和常规函数在 Pandas 类型上表现相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49846534/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com