Как удалить словари со значениями NaN из списка - PullRequest
1 голос
/ 04 апреля 2020

Это кажется довольно простой вещью, но я не смог найти ответ на этот вопрос здесь (пока).

У меня есть список словарей, и некоторые из словарей в списке имеют Значения NaN. Мне просто нужно удалить любой словарь из списка, если в нем есть значение NaN.

Я сам пробовал несколько разных способов. Вот одна попытка с фильтром и лямбда-функцией, которая получила TypeError («должно быть реальное число, а не dict_values», что имеет смысл):

from math import isnan

def remove_dictionaries_missing_data(list_of_dictionaries):
    return list(filter(lambda dictionary: not math.isnan(dictionary.values()), \
                                          list_of_dictionaries))

Я также попробовал это с парой вложенных циклов и некоторыми код, в котором я действительно не был уверен, и получил ту же ошибку:

from math import isnan

def remove_dictionaries_missing_data(list_of_dictionaries):
    cleaned_list = []
    for dictionary in list_of_dictionaries:
        if not math.isnan(dictionary[value] for value in dictionary.values()):
            cleaned_list.append(dictionary)
    return cleaned_list

... и, наконец, только с пониманием списка (та же ошибка):

from math import isnan
def remove_movies_missing_data(movies):
    return [movie for movie in movies if not math.isnan(movie.values())]

РЕДАКТИРОВАТЬ:

Вот тот же список, с которым я работаю:

[{'year': 2013,
  'imdb': 'tt2005374',
  'title': 'The Frozen Ground',
  'test': 'nowomen-disagree',
  'clean_test': 'nowomen',
  'binary': 'FAIL',
  'budget': 19200000,
  'domgross': nan,
  'intgross': nan,
  'code': '2013FAIL',
  'budget_2013$': 19200000,
  'domgross_2013$': nan,
  'intgross_2013$': nan,
  'period code': 1.0,
  'decade code': 1.0},
 {'year': 2011,
  'imdb': 'tt1422136',
  'title': 'A Lonely Place to Die',
  'test': 'ok',
  'clean_test': 'ok',
  'binary': 'PASS',
  'budget': 4000000,
  'domgross': nan,
  'intgross': 442550.0,
  'code': '2011PASS',
  'budget_2013$': 4142763,
  'domgross_2013$': nan,
  'intgross_2013$': 458345.0,
  'period code': 1.0,
  'decade code': 1.0},
... ]

1 Ответ

2 голосов
/ 04 апреля 2020

dictionary.values() - генератор для всех значений в словаре. Вам нужно позвонить math.isnan() по отдельным значениям. Вы можете использовать any() для этого:

def remove_dictionarries_missing_data(list_of_dictionaries):
    return [d for d in list_of_dictionaries 
             if not any(isinstance(val, float) and math.isnan(val) for val in d.values())]
...