У меня есть следующий код:
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
Вам нужно проверить 'NaN'
как строку вместо использования isnan
(предположительно np.isnan
), который ожидает числовое значение. Но есть еще несколько замечаний:
'NaN'
. Без этого вы потеряете другие предметы. См. Ниже, как вы можете определить трехмерное утверждение.my_dataset_clean = my_dataset
не создает копию вашего словаря. Для этого вам нужно быть явным, например my_dataset_clean = my_dataset.copy()
. В противном случае у вас есть только две переменные, указывающие на один и тот же словарь.Вот пример со словарным пониманием и тройным утверждением:
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
ссылаются на ключи/значения во внутренних словарях.
'NaN'
в ваших словарях - это строка. Вместо isnan
вы можете просто использовать сравнение строк: my_dataset[item][k] == 'NaN'
.