Я хотел бы заменить неверные значения в столбце фрейма данных на NaN.
mydata = {'x' : [10, 50, 18, 32, 47, 20], 'y' : ['12', '11', 'N/A', '13', '15', 'N/A']}
df = pd.DataFrame(mydata)
df[df.y == 'N/A']['y'] = np.nan
Однако последняя строка не работает и выдает предупреждение, потому что она работает с копией df. Итак, как правильно с этим справиться? Я видел много решений с iloc или ix, но здесь мне нужно использовать логическое условие.
Ответы:
просто используйте
replace
:То, что вы пытаетесь, называется цепным индексированием: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
Вы можете использовать ,
loc
чтобы убедиться , что вы работать на оригинальном ДФ:источник
Хотя использование
replace
вроде бы решает проблему, я хотел бы предложить альтернативу. Проблема с сочетанием числовых и некоторых строковых значений в столбце не для замены строк на np.nan, а для правильного отображения всего столбца. Могу поспорить, что исходный столбец, скорее всего, имеет объектный тип.Что вам действительно нужно, так это сделать его числовым столбцом (он будет иметь правильный тип и будет работать намного быстрее), со всеми нечисловыми значениями, замененными на NaN.
Таким образом, хороший код преобразования будет
Укажите,
errors='coerce'
чтобы строки, которые не могут быть проанализированы до числового значения, становились NaN. Тип столбца будетисточник
Вы можете использовать замену:
Также помните о
inplace
параметре дляreplace
. Вы можете сделать что-то вроде:Это заменит все экземпляры в df без создания копии.
Точно так же, если вы столкнетесь с другими типами неизвестных значений, такими как пустая строка или значение None:
Ссылка: Pandas Latest - Заменить
источник
Начиная с pandas 1.0.0, вам больше не нужно использовать numpy для создания нулевых значений в вашем фрейме данных. Вместо этого вы можете просто использовать pandas.NA (который имеет тип pandas._libs.missing.NAType), поэтому он будет обрабатываться как null внутри фрейма данных, но не будет иметь значение NULL вне контекста фрейма данных.
источник
Это решит вашу проблему. С двойным [] вы работаете с копией DataFrame. Вы должны указать точное местоположение в одном вызове, чтобы иметь возможность его изменить.
источник
Вы можете попробовать эти фрагменты.
источник
df.replace ('значение столбца', np.NaN, inplace = True)
источник