Написал функцию для количественного определения нулей в каждом столбце фрейма данных, но не удаляет

Я пишу функцию для автоматической проверки количества нулевых значений на столбец во фрейме данных, а затем, если количество нулевых значений меньше или равно 2000, удалить строки, содержащие нулевые значения.

Я написал некоторый код, который успешно выводит текстовые строки, чтобы отметить, какой столбец он проанализировал.

def drop_na(df,cols):
    for i in cols:

        missing_vals = df[i].isnull().sum()


        if missing_vals <= 2000:
            df = df.dropna(subset=[i])
        print(f'finished checking column  "{i}"')
    print('FINISHED ALL!')

Я проверяю, были ли строки, содержащие нуль, удалены с помощью data.isnull().sum() после успешного выполнения кода (где данные - это имя моего фрейма данных), но в столбцах существуют те же нулевые значения.

Я вызываю функцию с помощью drop_na(data, data.columns)


person Jon    schedule 03.05.2019    source источник
comment
Вы должны использовать inplace=True в dropna. pandas.pydata.org/pandas-docs/ стабильный/ссылка/API/   -  person 3UqU57GnaX    schedule 03.05.2019


Ответы (1)


Похоже, вы удаляете только строки только внутри функции. Выполнение этого на месте решает проблему, как в следующем коде:

def drop_na(data):
    cols = data.cols
    subset = []
    # Determine bad columns, and store them in `subset` list.
    for i in cols:
        missing_vals = df[i].isnull().sum()
        if missing_vals <= 2000:
            subset.append(i)
    # Now remove all bad columns at once, but inplace.
    df.dropna(subset=subset, inplace=True)
    print('FINISHED ALL!')

Если вы не хотите делать это на месте, тогда работает возврат df и присвоение возвращаемого значения новой переменной df2 = drop_na(data). Не забудьте переиндексировать новый фрейм данных, если вам это нужно.

person Michael Heidelberg    schedule 03.05.2019