我有一个字符串列表
x = ['A', 'B', nan, 'D']
并希望删除nan。
我试过了:
x = x[~numpy.isnan(x)]
但只有在包含数字时才有效。我们如何在Python 3 +中为字符串解决这个问题?
答案 0 :(得分:5)
如果你有一个numpy数组,你只需检查该项不是字符串nan
,但如果你有一个列表,你可以检查is
和np.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']
。