【问题标题】:Pandas series np.max with NaN does not show NaN as max value unlike numpy与 numpy 不同,带有 NaN 的 Pandas 系列 np.max 不会将 NaN 显示为最大值
【发布时间】:2021-10-11 00:19:14
【问题描述】:

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 有“初始”参数:

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

熊猫它给出了一个错误:

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.max 实际上将任务委托给熊猫系列.max 方法。检查它的文档。那有skipna参数
  • 请注意,您的错误回溯实际上引发了pandas 代码中的错误。 initial 验证已传递给 pandasnp.max(data_df['colname'].values, initial=1)pure numpy 版本。
  • @hpaulj 你回答了我的问题,如果你发表你的评论作为答案,我会接受它作为解决方案。
  • 虽然这很令人费解,为什么这两种实现如此不同。

标签: python pandas numpy nan


【解决方案1】:

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

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

是纯numpy版本。

(稍后我可能会添加详细信息。)

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

【讨论】:

    【解决方案2】:

    如果您使用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)
    

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2018-10-15
      • 2016-02-08
      • 2021-07-11
      • 1970-01-01
      • 2014-12-02
      • 2018-01-14
      相关资源
      最近更新 更多