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

时间:2017-03-23 15:24:39

标签: python python-3.x numpy

我有一个字符串列表

x = ['A', 'B', nan, 'D']

并希望删除nan。

我试过了:

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

但只有在包含数字时才有效。我们如何在Python 3 +中为字符串解决这个问题?

4 个答案:

答案 0 :(得分:5)

如果你有一个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']

答案 1 :(得分:3)

您可以使用math.isnan和一个古老的列表理解。

这样的事情可以解决问题:

import math
x = [y for y in x if not math.isnan(y)]

答案 2 :(得分:1)

您可能希望避免使用字符串np.nan,而是使用None;但如果你有nan,你可以这样做:

import numpy as np

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

答案 3 :(得分:1)

你也可以试试这个:

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

或者,在开头将所有内容转换为str

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

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