Замена NaN на среднее значение столбца в DataFrame pandas

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы быстро заменить значения NaN в pandas DataFrame на среднее по столбцам, можно воспользоваться следующей конструкцией:

Python
Скопировать код
df.fillna(df.mean(), inplace=True)

Эта команда рассчитывает средние значения по каждому столбцу и заменяет на них пропущенные данные, при этом изменяя исходный DataFrame.

Кинга Идем в IT: пошаговый план для смены профессии

Заполнение пропущенных значений средними по столбцам

Зачем конвертировать средние значения столбцов в словарь?

Метод fillna поддерживает в качестве аргумента value не только скаляры, но и словари или серии. Если нужно тонко настроить процесс заполнения, можно преобразовать средние значения в словарь:

Python
Скопировать код
mean_values = df.mean().to_dict()  # Составляем словарь со средними значениями по столбцам
df.fillna(mean_values, inplace=True)

Это позволит применять средние значения выборочно, увеличивая контроль над процессом обработки данных.

Экономия вычислительных ресурсов при работе с большими DataFrames

При работе с большими наборами данных может быть полезным заполнять NaN значения выборочно, что улучшает производительность:

Python
Скопировать код
nan_columns = df.columns[df.isna().any()].tolist() # Выявляем столбцы с NaN значениями
df[nan_columns] = df[nan_columns].fillna(df.mean())

Таким образом, заполняются только нужные столбцы, что снижает нагрузку на систему.

Использование lambda и apply()

Для ещё большего контроля можно использовать лямбда-функции в паре с apply():

Python
Скопировать код
df = df.apply(lambda x: x.fillna(x.mean()) if x.isna().any() else x)

Такой подход гарантирует, что каждый столбец обрабатывается индивидуально и замена пропущенных значений средними производится только там, где это действительно требуется.

Визуализация

Взаимодействие с pandas DataFrame можно сравнить со уходом за садом:

Помидор 🍅Роза 🌹Подсолнух 🌻
537
3NaN4
NaN2NaN

После применения замены NaN на среднее по столбцам картина меняется (например, в столбце с розами 🌹):

Помидор 🍅Роза 🌹Подсолнух 🌻
537
32.54
425.5

Теперь в каждом столбце нет места для NaN, все данные на своих местах!

Сценарии использования и предупреждения

Когда целесообразно использовать средние значения

Заполнение пропущенных данных средними значениями рекомендуется для столбцов с нулевым разбросом данных, так как в этом случае эта операция не внесет искажений в общую картину данных. Однако всё зависит от контекста и свойств конкретных данных.

Предостережение

Важно понимать, что замена NaN значений на средние может исказить результаты последующего анализа данных. Поэтому следует относиться к этому методу с осторожностью, особенно при статистическом анализе.

Другие методы заполнения данных

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

Полезные материалы

  1. pandas.DataFrame.fillna — документация pandas 2.2.0 — подробное описание метода fillna() в библиотеке Pandas.
  2. Заполнение пропущенных значений средними значениями по группе – Stack Overflow — пример использования fillna() со средними значениями по группам на Stack Overflow.
  3. Работа с пропущенными данными в Pandas – GeeksforGeeks — руководство по обработке пропущенных данных в Pandas.
  4. Понимание функции Transform в Pandas – Practical Business Python — статья о методах преобразования данных с использованием библиотеки Pandas.
  5. pandas DataFrame: Как облегчить работу с данными – Real Python — учебный материал по управлению пропущенными данными.
  6. Обработка пропущенных данных | Kaggle — рекомендации по предобработке и управлению пропущенными значениями на площадке Kaggle.
  7. Chris Albon — наглядное руководство по замене NaN на средние значения по столбцам в Pandas.