【问题标题】:delete 'nan' or reduce length of numpy array if array contains nan after converting to numpy from pandas [duplicate]从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]
【发布时间】:2017-07-12 06:33:54
【问题描述】:

我想从一个 numpy 数组中删除 nan。假设我的 numpy 数组包含:

np_array = ["123","pqr","123",nan,"avb", nan]

预期输出:

["123","pqr","123","avb"]

如果我们在 pandas 中使用 pandas.dropna() 执行此操作,它会删除我不想执行的整行。我只想删除值并减小数组大小。

有什么办法可以做到吗?

【问题讨论】:

  • 这些建议的重复只适用于数字数组(所以这些不是真正的重复)!
  • 我假设您也不想删除这些行?
  • 你看过 pandas.fillna() 吗?一般来说,如果将一行视为观察值,我们会尝试保留整行,而不仅仅是删除行内的 nan 值。

标签: python arrays numpy


【解决方案1】:

您不能使用np.isnan,因为NaNs 是数组中的字符串,但您可以通过与字符串比较来使用布尔索引:"nan"

>>> import numpy as np
>>> np_array = np.array(["123","pqr","123",np.nan,"avb", np.nan])
>>> np_array[np_array != 'nan']
array(['1234', 'pqr', '123', 'avb'], 
      dtype='<U4')

【讨论】:

    【解决方案2】:

    isnan() 应该可以解决问题。关于如何做到这一点的最小示例:

    >>> import numpy as np
    >>> np_array = np.array([1,2,3,np.nan,4])
    >>> np_array
    array([  1.,   2.,   3.,  nan,   4.])
    >>> np_array = np_array[~np.isnan(np_array)]
    >>> np_array
    array([ 1.,  2.,  3.,  4.])
    

    【讨论】:

    • 不起作用:错误:*** TypeError: 输入类型不支持 ufunc 'isnan',输入 c ting 规则 ''safe'' 它的 dtype 是 object
    • 检查阵列的dtypeisnan 为对象数组引发该错误。如果没有理由拥有对象数组,您可以执行arr.dtype=np.float64 或任何您想要的操作,然后isnan 将起作用。如果您确实需要对象,请使用上面 MSeifert 的答案。
    【解决方案3】:

    试试这个

    np_clean = [x for x in np_array if str(x) != 'nan']
    

    它会从你的列表中删除 nan

    【讨论】:

      【解决方案4】:

      这适用于数值数组。

      filter(lambda x: np.isfinite(x), np.array([1,2,3,np.nan]))
      
      >>>[1.0, 2.0, 3.0]
      

      【讨论】:

        猜你喜欢
        • 2021-05-28
        • 2018-12-21
        • 1970-01-01
        • 2015-05-21
        • 1970-01-01
        • 2021-06-20
        • 2019-12-22
        相关资源
        最近更新 更多