Как заменить NaN из словаря в Python - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующий код:

my_dataset={'item1':{'item11':0,'item12':'NaN','item13':2},'item2':{'item21':0,'item22':'NaN','item23':2}}
my_dataset_clean=my_dataset
for item in my_dataset:
     my_dataset_clean[item] = {k: 0 for k in my_dataset[item] if isnan(my_dataset[item][k])}

Я получаю эту ошибку:

my_dataset_clean [item] = {k: 0 для k в my_dataset [item] ifisnan (my_dataset [item] [k])} Ошибка типа: должно быть действительным числом, а не str

Есть идеи о том, как решить проблему?Я хочу заменить NaN с 0s

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вам нужно проверить 'NaN' как строку вместо использования isnan (предположительно np.isnan), которое ожидает числовое значение.Но есть несколько других моментов, на которые стоит обратить внимание:

  1. Вы не определяете, что происходит, когда ваше значение равно , а не 'NaN'.Без этого вы потеряете другие предметы.Ниже описано, как вы можете определить троичное выражение.
  2. my_dataset_clean = my_dataset не создает копию вашего словаря.Вы должны быть явными, например, my_dataset_clean = my_dataset.copy(), чтобы сделать это.В противном случае у вас есть только две переменные, указывающие на один и тот же словарь.
  3. Вы можете использовать понимание словаря, чтобы избежать необходимости делать копию своего словаря.

Вот пример со словаремпонимание и троичное выражение:

my_dataset_clean = {k: {k2: 0 if v2 == 'NaN' else v2 for k2, v2 in v.items()} \
                    for k, v in my_dataset.items()}

Здесь k, v относится к ключам / значениям во внешнем словаре, а k2, v2 относится к ключам / значениям во внутренних словарях.

0 голосов
/ 11 октября 2018

'NaN' в ваших словарях это строка.Вместо isnan вы можете просто использовать сравнение строк: my_dataset[item][k] == 'NaN'.

...