【问题标题】:How to remove NaN from list of lists with string entries?如何从具有字符串条目的列表列表中删除 NaN?
【发布时间】:2019-09-04 14:30:47
【问题描述】:

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

[['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'' 无法安全地将输入强制转换为任何支持的类型

谁能指出我做错了什么

【问题讨论】:

  • 发布有关产生异常的代码的问题时,请始终包含 complete 回溯 - 复制并粘贴它,然后将其格式化为代码(选择它并输入 ctrl-k

标签: python list


【解决方案1】:

一种选择是将项目与自身进行比较(对于 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']]

【讨论】:

    【解决方案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']]
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-09
        • 2015-10-25
        • 2014-03-13
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        • 2019-02-12
        • 2011-03-31
        相关资源
        最近更新 更多