Удаление кортежей в списке кортежей, если кортеж содержит np.nan - PullRequest
0 голосов
/ 17 января 2020

Фильтр списка кортежей. Я попробовал несколько вещей, но они не работали:

    import numpy as np
    import sys
    import math
    #Python Version:  3.8.1 
    ZL = [('2011',np.nan),('2012',np.nan),('2013','B'),('2014','C')]
    #~ Desired output:   [('2013',20),('2014',34)]
    # I tried the following:
    #~ cleanedZL = filter(lambda x:x[1] != np.nan,ZL)   # Does not work
    #~ cleanedZL = filter(lambda x:x[1] != 'nan',ZL)         # Does not work
    #~ cleanedZL = [i for i in ZL if not math.isnan(i[1])]   # Does not work 
    #~ cleanedZL = [i for i in ZL if i[1] != np.nan]      # Does not work 
    cleanedZL = [i for i in ZL if i[1] != 'nan']      # Does not work 
    for a in cleanedZL:
       print (a)

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Вам просто нужно изменить утверждение If, тогда оно будет работать.

import numpy as np

ZL = [('2011', np.nan), ('2012', np.nan), ('2013', 'B'), ('2014', 'C')]
final = [i for i in ZL if np.nan not in i]
print(final)

Ответ: -

[('2013', 'B'), ('2014', 'C')]
0 голосов
/ 17 января 2020

Все ваши попытки близки, но ваше состояние не совсем правильное.

Ваша главная проблема в том, что np.nan != np.nan, поэтому вам нужно другое условие для тестирования. Например, вы можете использовать np.isnan(), но это не удастся, если вы введете строки.

Какие значения находятся на второй позиции ваших кортежей? Если есть только strings или np.nan, вы можете использовать isinstance(x, str) для своего фильтра:

cleanedZL = [x for x in ZL if isinstance(i[1], str)]
cleanedZL = list(filter(lambda x:isinstance(x[1],str), ZL))

См. Также этот вопрос , возможно, лучшее решение для сравнения np.nans

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...