从 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
,因为NaN
s 是数组中的字符串,但您可以通过与字符串比较来使用布尔索引:"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 检查阵列的dtype
。 isnan
为对象数组引发该错误。如果没有理由拥有对象数组,您可以执行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 数据帧