Я видел эту и эту ветку здесь, но что-то еще не так.
У меня есть очень большой pandas DataFrame со многими значениями Na / NaN. Я хочу заменить их медианным значением для этой функции.
Итак, я сначала создаю таблицу, в которой отображаются значения Na для каждой функции, отсортированные по большинству значений Na, затем использую fillna (), а затем снова отображаю эту таблицу. В идеале, во второй раз эта таблица должна иметь все 0, потому что все Na заполнены.
nullCount = pd.DataFrame(TT_df.isnull().sum(),columns=["nullcount"]).sort_values(by="nullcount",ascending=False)
display(nullCount.head(10))
TT_df = TT_df.fillna(TT_df.median())
nullCount = pd.DataFrame(TT_df.isnull().sum(),columns=["nullcount"]).sort_values(by="nullcount",ascending=False)
display(nullCount.head(10))
Однако я получаю две таблицы:
таблицы нулевого счета до и после
и если я взгляну на DataFrame, вы увидите в нем NaN:
display(TT_df[nullCount.index.tolist()[0:5]].head(50))
NaN примеры
Кажется, что общая проблема с fillna () заключается в том, что она возвращает копию, если вы не используете inplace = True (как в приведенных выше ссылках), но я не делаю это: I Перезаписываю TT_df, если я что-то не так понимаю. Вы можете видеть, что функция LotFrontage действительно исчезает из второй таблицы, подразумевая, что fillna () сработала для нее. Так почему же это не работает для других?
Я подозреваю, что виновником является, хотя я не знаю, почему Na на самом деле не означает Na для этих функций: если я смотрю на файл описания данных, он говорит:
GarageFinish: внутренняя отделка гаража
Fin Finished
RFn Rough Finished
Unf Unfinished
NA No Garage
Хорошо, все в порядке. Но кажется, что эти значения NA должны считаться как Na для isnull () и fillna (), так и не считаться для обоих. Почему он считается isnull (), а не fillna ()?