Pandas fillna () не работает с фрагментами DataFrame

Pandas fillna не работает с фрагментами DataFrame, вот пример

df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                [3, 4, np.nan, 1],
                [np.nan, np.nan, np.nan, 5],
                [np.nan, 3, np.nan, 4]],
                columns=list('ABCD'))
df[["A", 'B']].fillna(0, inplace=True)

DataFrame не меняется

    A   B   C   D
0   NaN 2.0 NaN 0
1   3.0 4.0 NaN 1
2   NaN NaN NaN 5
3   NaN 3.0 NaN 4

напротив

df["A"].fillna(0, inplace=True)

а также

df.fillna(0, inplace=True)

работать нормально.

Это баг или все работает как задумано? Спасибо заранее.

P.S. Вопрос это просит как использовать fillna на срезе, что касается моего вопроса, он касается Зачем, вышеизложенное не работает. Ответ находится в разделе комментариев ответов @heena-bawa.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
2 095
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если мы посмотрим на pandas documentation, он говорит, что вы должны использовать следующее для fillna на срезах:

values = {'A':0, 'B':0}
df.fillna(value=values, inplace=True)

print(df)

     A    B   C  D
0  0.0  2.0 NaN  0
1  3.0  4.0 NaN  1
2  0.0  0.0 NaN  5
3  0.0  3.0 NaN  4

спасибо за ответ, но я думаю, что dict/Series или DF нужно «указать, какое значение использовать для каждого индекса», а df[["A", 'B']] — это прекрасно DataFrame. Ваш метод является хорошим обходным путем, но снова мой вопрос был: «Это ошибка или она работает так, как задумано?».

HP6 13.04.2019 14:11
Ответ принят как подходящий

Вы можете использовать:

df[['A','B']] = df[['A','B']].fillna(0)

     A    B   C  D
0  0.0  2.0 NaN  0
1  3.0  4.0 NaN  1
2  0.0  0.0 NaN  5
3  0.0  3.0 NaN  4

Разве цель inplace=True не в том, чтобы избежать использования оператора присваивания?

HP6 13.04.2019 14:42

inplace=True для фрагмента фрейма данных не будет работать. Он работает на полном фрейме данных. Вы должны обновить только фрагмент.

heena bawa 13.04.2019 14:46

Для получения дополнительной информации вы можете обратиться: pandas.pydata.org/pandas-docs/stable/user_guide/indexing.htm‌​l

heena bawa 13.04.2019 14:50

Я думаю, что это работает так, как задумано. Если я попробую ваш код, он выдает предупреждение:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  downcast=downcast, **kwargs)

Значение: выбирая столбцы таким образом, вы создаете копию, и поэтому параметр на месте не может иметь эффекта.

Другие вопросы по теме