【发布时间】:2014-03-28 18:23:35
【问题描述】:
如果行 = nan 或 0,我想从表中删除所有值。
我知道有一种方法可以使用 pandas 来做到这一点,即 pandas.dropna(how = 'all'),但我想要一个 numpy 方法来删除所有 nan 或 0 的行。
有没有有效的实现方式?
【问题讨论】:
-
第一个似乎是最好的选择。
如果行 = nan 或 0,我想从表中删除所有值。
我知道有一种方法可以使用 pandas 来做到这一点,即 pandas.dropna(how = 'all'),但我想要一个 numpy 方法来删除所有 nan 或 0 的行。
有没有有效的实现方式?
【问题讨论】:
这将删除所有全为零或全为 nan 的行:
mask = np.all(np.isnan(arr), axis=1) | np.all(arr == 0, axis=1)
arr = arr[~mask]
这将删除所有零或 nan 的所有行:
mask = np.all(np.isnan(arr) | arr == 0, axis=1)
arr = arr[~mask]
【讨论】:
import numpy as np
a = np.array([
[1, 0, 0],
[0, np.nan, 0],
[0, 0, 0],
[np.nan, np.nan, np.nan],
[2, 3, 4]
])
mask = np.all(np.isnan(a) | np.equal(a, 0), axis=1)
a[~mask]
【讨论】:
a[~foo] 是一个就地删除操作符。 Jaime 的帖子清楚地表明,这会创建一个您需要重新分配的新数组。
我喜欢这种方法
import numpy as np
arr = np.array([[ np.nan, np.nan],
[ -1., np.nan],
[ np.nan, -2.],
[ np.nan, np.nan],
[ np.nan, 0.]])
mask = (np.nan_to_num(arr) != 0).any(axis=1)
输出:
>>> arr[mask]
... array([[ -1., nan],
[ nan, -2.]])
【讨论】:
另外:如果行在任何单个值中有 nan 或 0 时要删除行
a = np.array([
[1, 0, 0],
[1, 2, np.nan],
[np.nan, np.nan, np.nan],
[2, 3, 4]
])
mask = np.any(np.isnan(a) | np.equal(a, 0), axis=1)
a[~mask]
输出
array([[ 2., 3., 4.]])
【讨论】:
列表推导式可以用作单行。
>> a = array([65.36512 , 39.98848 , 28.25152 , 37.39968 , 59.32288 , 40.85184 ,
71.98208 , 41.7152 , 33.71776 , 38.5504 , 21.34656 , 37.97504 ,
57.5968 , 30.494656, 80.03776 , 33.94688 , 37.45792 , 27.617664,
15.59296 , 27.329984, 45.2256 , 61.27872 , 57.8848 , 87.4592 ,
34.29312 , 85.15776 , 46.37696 , 79.11616 , nan, nan])
>> np.array([i for i in a if np.isnan(i)==False])
array([65.36512 , 39.98848 , 28.25152 , 37.39968 , 59.32288 , 40.85184 ,
71.98208 , 41.7152 , 33.71776 , 38.5504 , 21.34656 , 37.97504 ,
57.5968 , 30.494656, 80.03776 , 33.94688 , 37.45792 , 27.617664,
15.59296 , 27.329984, 45.2256 , 61.27872 , 57.8848 , 87.4592 ,
34.29312 , 85.15776 , 46.37696 , 79.11616 ])
【讨论】: