如何从NumPy数组中删除NaN值?

[1, 2, NaN, 4, NaN, 8]   ⟶   [1, 2, 4, 8]

当前回答

filter(lambda v: v==v, x)

既适用于列表和numpy数组 因为v !=v仅用于NaN

其他回答

试试这个:

import math
print [value for value in x if not math.isnan(value)]

要了解更多,请阅读列表推导式。

Pandas引入了一个将所有数据类型转换为缺失值的选项。

https://pandas.pydata.org/docs/user_guide/missing_data.html

np.isnan()函数不兼容所有的数据类型,例如:

>>> import numpy as np
>>> values = [np.nan, "x", "y"]
>>> np.isnan(values)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

pd.isna()和pd.notna()函数与许多数据类型兼容,pandas引入了pd.notna()函数。NA值:

>>> import numpy as np
>>> import pandas as pd

>>> values = pd.Series([np.nan, "x", "y"])
>>> values
0    NaN
1      x
2      y
dtype: object
>>> values.loc[pd.isna(values)]
0    NaN
dtype: object
>>> values.loc[pd.isna(values)] = pd.NA
>>> values.loc[pd.isna(values)]
0    <NA>
dtype: object
>>> values
0    <NA>
1       x
2       y
dtype: object

#
# using map with lambda, or a list comprehension
#

>>> values = [np.nan, "x", "y"]
>>> list(map(lambda x: pd.NA if pd.isna(x) else x, values))
[<NA>, 'x', 'y']
>>> [pd.NA if pd.isna(x) else x for x in values]
[<NA>, 'x', 'y']

如果你使用numpy

# first get the indices where the values are finite
ii = np.isfinite(x)

# second get the values
x = x[ii]

做到以上几点:

x = x[~numpy.isnan(x)]

or

x = x[numpy.logical_not(numpy.isnan(x))]

我发现重置到相同的变量(x)并没有删除实际的nan值,必须使用不同的变量。将其设置为不同的变量删除了nan。 如。

y = x[~numpy.isnan(x)]

如果它有帮助,对于简单的1d数组:

x = np.array([np.nan, 1, 2, 3, 4])

x[~np.isnan(x)]
>>> array([1., 2., 3., 4.])

但如果你希望扩展到矩阵并保留形状:

x = np.array([
    [np.nan, np.nan],
    [np.nan, 0],
    [1, 2],
    [3, 4]
])

x[~np.isnan(x).any(axis=1)]
>>> array([[1., 2.],
           [3., 4.]])

我在处理pandas .shift()功能时遇到了这个问题,我想避免使用.apply(…,轴=1)由于其效率低下,不惜一切代价。