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.






Вы можете использовать:
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 не в том, чтобы избежать использования оператора присваивания?
inplace=True для фрагмента фрейма данных не будет работать. Он работает на полном фрейме данных. Вы должны обновить только фрагмент.
Для получения дополнительной информации вы можете обратиться: pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html
Я думаю, что это работает так, как задумано. Если я попробую ваш код, он выдает предупреждение:
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)
Значение: выбирая столбцы таким образом, вы создаете копию, и поэтому параметр на месте не может иметь эффекта.
спасибо за ответ, но я думаю, что
dict/SeriesилиDFнужно «указать, какое значение использовать для каждого индекса», аdf[["A", 'B']]— это прекрасноDataFrame. Ваш метод является хорошим обходным путем, но снова мой вопрос был: «Это ошибка или она работает так, как задумано?».