如何从带有字符串条目的列表列表中删除NaN?

时间:2019-09-04 14:30:47

标签: python list

我正在尝试从列表列表(带有字符串条目)中删除所有nan,我的数据如下:

[['beer', 'nuts', nan], 
['beer', 'butter', 'apple'], 
['beer', 'nuts', 'cheese'], 
['beer', 'bananas', nan], 
['beer', 'nuts', 'apple']]

我想得到这个结果:

[['beer', 'nuts'], 
['beer', 'butter', 'apple'], 
['beer', 'nuts', 'cheese'], 
['beer', 'bananas'], 
['beer', 'nuts', 'apple']]

我尝试从(How to remove nan's from list of lists? [duplicate] How to delete [NaN] from a list of lists?)中得到答案,即:

import math
nan = float('nan')

store_data_list = [[x for x in y if not math.isnan(x)] for y in store_data_list] #remove nans from list of lists

#AND

store_data_list = [xs for xs in store_data_list if not any(math.isnan(x) for x in xs)]

#AND

store_data_list = [[x for x in y if not np.isnan(x)] for y in store_data_list]

在我的实例中,两者似乎都不起作用。我得到了错误:

  

TypeError:必须为实数,而不是str

     

TypeError:输入类型不支持ufunc'isnan',并且根据强制转换规则“ safe”,不能将输入安全地强制转换为任何受支持的类型

有人可以指出我在做什么错

3 个答案:

答案 0 :(得分:4)

一种选择是将项目与其自身进行比较(nan则为假)

nan = float('nan')
data = [['beer', 'nuts', nan], 
        ['beer', 'butter', 'apple'], 
        ['beer', 'nuts', 'cheese'], 
        ['beer', 'bananas', nan], 
        ['beer', 'nuts', 'apple']]
[[i for i in j if i == i] for j in data]

给予

[['beer', 'nuts'],
 ['beer', 'butter', 'apple'],
 ['beer', 'nuts', 'cheese'],
 ['beer', 'bananas'],
 ['beer', 'nuts', 'apple']]

答案 1 :(得分:2)

math.isnanfloat作为参数,而不是str,可以在使用math.isnan之前进行此检查:

store_data_list = [[x for x in y if type(x) != float or not math.isnan(x)] for y in store_data_list]

print(store_data_list)

输出:

[['beer', 'nuts'],
 ['beer', 'butter', 'apple'],
 ['beer', 'nuts', 'cheese'],
 ['beer', 'bananas'],
 ['beer', 'nuts', 'apple']]

答案 2 :(得分:1)

您可以尝试以下方法:

import numpy as np
import pandas as pd
my_list = pd.Series(['a','b', np.NaN, 'c'])
my_new_list = ["Sample_text" if pd.isnull(element) else element for element in my_list]
my_new_list

输出:

['a', 'b', 'Sample_text', 'c']