从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]

Posted

技术标签:

【中文标题】从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]【英文标题】:delete 'nan' or reduce length of numpy array if array contains nan after converting to numpy from pandas [duplicate] 【发布时间】: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 值。 【参考方案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]

【讨论】:

以上是关于从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 Pandas Dataframe 转换为 numpy 数组

如何将 Numpy 数组转换为 Panda DataFrame

将结构化 numpy 数组(包含子数组)转换为 pandas 数据帧

将列表列表的字符串转换为 Numpy 数组

将 Numpy 数组按列转换为 Pandas DataFrame(作为单行)

python 将Numpy数组转换为Pandas Dataframe