与 numpy 不同,Pandas 系列 np.max 与 NaN 不将 NaN 显示为最大值

Pandas series np.max with NaN does not show NaN as max value unlike numpy

data_df["colname"]

<class 'pandas.core.series.Series'>

0     -475.0
1     -799.0
2     -656.0
3     -444.0
4     -901.0
       ...
575      NaN
576      NaN
577      NaN
578      NaN
579      NaN


type(data_df["colname"].iloc[579])
<class 'numpy.float64'>

data_df["colname"].iloc[579] 
nan

当我 运行 带有 np.nan 的普通数组时,我得到以下结果:

>>> np.max([1,2,3,4,np.float64(np.nan)], initial=1)
nan

>>> np.max([1,2,3,4,np.nan], initial=1)
nan

但是对于 pandas,尽管包含 NaN 值:

np.max(data_df["colname"]) 
83.0

不匹配,这是怎么回事?


此外,尽管 np.amax 有 'initial' 参数:

>>> np.max([1,2,3,4,np.nan], initial=1)
nan

pandas 报错:

np.max(data_df["colname"], initial=1)


    validate_kwargs(fname, kwargs, self.defaults)
  File "/Users/-/poetry/virtualenvs/-/lib/python3.9/site-packages/pandas/util/_validators.py", line 153, in validate_kwargs
    _check_for_invalid_keys(fname, kwargs, compat_args)
  File "/Users/-/poetry/virtualenvs/-/lib/python3.9/site-packages/pandas/util/_validators.py", line 127, in _check_for_invalid_keys
    raise TypeError(f"{fname}() got an unexpected keyword argument '{bad_arg}'")
TypeError: max() got an unexpected keyword argument 'initial'

似乎没有通过 pandas 关键字参数验证。

如果您使用 np.nanmax() 功能,它可以解决问题:

import numpy as np

np.nanmax([1,2,3,4,np.nan])

输出

4.0

您也可以将此解决方案用于 pandas DataFrame:

import numpy as np

np.nanmax(data_df["colname"].values)

请注意,您的错误回溯实际上会引发 pandas 代码中的错误。初始验证已传递给 pandas.

 np.max(data_df['colname'].values, initial=1) 

是纯numpy版本

(稍后我会补充细节。)

np.max 视为与其他 numpy ufunc 行为相似的原始版本。 np.nanmaxnanfunctions.py 中的众多附加组件之一。在这里它将 nan 替换为 -inf。并且只适用于花车。 pandas 用户更多地遇到丢失数据,因此其开发人员添加了 bells-n-whistles,额外的 nan 处理确实花费时间。