如何在Python中从字符串列表中删除numpy的nan?

6
我有一个字符串列表。
x = ['A', 'B', nan, 'D']

并想要移除NaN。

我尝试过:

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

但这仅适用于包含数字的情况。在Python 3+中,我们如何解决字符串的问题?


@Kasramvd,你能解释一下“numpy nan”的含义吗? - Josh Lee
@JoshLee OP正在使用numpy模块中的non对象。我将其更改为numpy,以便未来的提问者可以轻松找到该问题。 - Mazdak
4个回答

6

如果您有一个numpy数组,您可以简单地检查该项不是字符串nan,但如果您有一个列表,您可以使用isnp.nan来检查其身份,因为它是单例对象。

In [25]: x = np.array(['A', 'B', np.nan, 'D'])

In [26]: x
Out[26]: 
array(['A', 'B', 'nan', 'D'], 
      dtype='<U3')

In [27]: x[x != 'nan']
Out[27]: 
array(['A', 'B', 'D'], 
      dtype='<U3')


In [28]: x = ['A', 'B', np.nan, 'D']

In [30]: [i for i in x if i is not np.nan]
Out[30]: ['A', 'B', 'D']

如果你有一个Python列表,可以采用函数式方法实现:
In [34]: from operator import is_not

In [35]: from functools import partial

In [37]: f = partial(is_not, np.nan)

In [38]: x = ['A', 'B', np.nan, 'D']

In [39]: list(filter(f, x))
Out[39]: ['A', 'B', 'D']

聚合像这样的东西:[i for i in x if not i in ['nan', np.nan]],否则加1 - Colonel Beauvel
@ColonelBeauvel 是的,如果你不知道你正在处理的数据结构,那是个好主意。 - Mazdak
NaN不是单例。 - Josh Lee
@JoshLee 为什么?我认为只要你不能从特定对象创建不同的实例,它就被称为单例。关于 np.nan 是否有特殊之处吗? - Mazdak
np.nan只是一些浮点常量。出于同样的原因,您也不会比较is math.pi - Josh Lee
@JoshLee 嗯,依我之见,这并没有什么区别,因为在 Python 中几乎所有的东西都是对象,甚至代码也是对象。一旦某个东西成为对象,它就可以是单例或常规对象(据我所知),例如 -5 到 256 之间的整数或其他在 Python 中被缓存到内存中的单例,而不是具有不同 ID 的多个实例。 - Mazdak

3
你可以使用math.isnan和一个简单的列表推导式。
像这样做就可以了:
import math
x = [y for y in x if not math.isnan(y)]

你尝试过 math.isnan('A') 吗?在 OP 的 x 上测试了吗? - hpaulj

1
您可能希望避免在字符串中使用np.nan,而应该使用None;但是如果您确实有nan,可以这样做:
import numpy as np

[i for i in x if i is not np.nan]
# ['A', 'B', 'D']

NaN不是一个单例。 - Josh Lee
@JoshLee 我并没有说它是单例模式。我只是建议在字符串情况下使用None而不是nan可能更好,因为nan会被转换为字符串nan,但None仍然保持为None - Psidom
你正在使用 is 进行比较,这将会失败。 - Josh Lee
@JoshLee,我不明白你的意思。它适用于这种情况。 - Psidom

1
您也可以尝试这个:

[s for s in x if str(s) != 'nan']

或者,一开始将所有内容转换为str
[s for s in map(str, x) if s != 'nan']

两种方法都会产生['A', 'B', 'D']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接