从numpy对象数组中过滤nan

c2e8gylq  于 2023-04-12  发布在  其他
关注(0)|答案(2)|浏览(276)

我试图从数组中过滤出nan值。该数组是unique()调用的结果,在DataFrame列上包含字符串和NA的混合。我找不到直接的方法来完成。

% sprints = frame['col'].unique()
% sprints
array([nan, 'Sprint 3.3', 'Sprint 2.3', ...], dtype=object)

现在我想过滤nan
我自然在努力:

sprints[~np.isnan(sprints)]

这会给我一个错误:

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''

但即使我尝试用其他方法手工编写代码,也会遇到同样的错误:

sprints = frame['col'].unique().tolist()
[sprint for sprint in sprints if not np.isnan(sprint)]
...
same error

所以我采用了一种蛮力的方法:

def isna(val):
    try:
        return np.isnan(val)
    except:
        return False

sprints = frame['col'].unique().tolist()
[ sprint for sprint in sprints if not isna(sprint)]

...这是可行的,但感觉一定有更自然的方式,对吗?
numpy.isnan()中有一个casting参数,但将其设置为'unsafe'并不能解决问题。

pinkon5k

pinkon5k1#

方法是首先筛选DataFrame上的nas:

sprints = frame['col'].dropna().unique().tolist()

感谢@hpaulj的提示

5t7ly7z5

5t7ly7z52#

对于多个1d-numpy数组,您可以使用以下命令实现与dropna类似的效果:

import functools
import operator
import numpy as np

def filter_out_nans(*args):
    non_nan_indices = ~functools.reduce(operator.or_, map(np.isnan, args))
    return [arg[non_nan_indices] for arg in args]

x, y, z = filter_out_nans(x, y, z)

相关问题