Как заменить NaN из словаря в Python

1

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

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], если isnan (my_dataset [item] [k])} TypeError: должно быть действительным числом, а не str

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

Теги:
for-loop
dictionary
nan
nested

2 ответа

0
Лучший ответ

Вам нужно проверить '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 ссылаются на ключи/значения во внутренних словарях.

  • 1
    Большое спасибо за 3 балла. Ваш пример - именно то, чего я хотел достичь
1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню