Почему Fillna с медианой на датафрейме все еще оставляет Na / NaN в пандах? - PullRequest
0 голосов
/ 09 мая 2018

Я видел эту и эту ветку здесь, но что-то еще не так.

У меня есть очень большой 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 ()?

1 Ответ

0 голосов
/ 09 мая 2018

Проблема с этой строкой:

TT_df = TT_df.fillna(TT_df.median())

В вашем информационном кадре есть строки, и вы пытаетесь вычислить медианы для строк. Это не работает.

Вот минимальный пример:

import pandas as pd, numpy as np

df = pd.DataFrame({'A': ['A', 'B', np.nan, 'B']})

df = df.fillna(df.median())

print(df)

     A
0    A
1    B
2  NaN
3    B

Что вам нужно сделать, это fillna с медианой только для числовых столбцов:

for col in df.select_dtypes(include=np.number):
    df[col] = df[col].fillna(df[col].median())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...