
При работе с данными в Pandas пропуски часто возникают после объединения таблиц, импорта из внешних источников или удаления некорректных записей. Значения NaN могут нарушить расчёты, статистические анализы и обучение моделей. В таких случаях удобно заменить пропуски средним значением, рассчитанным по соответствующему столбцу или группе данных.
В Pandas операция замены NaN на среднее выполняется с помощью метода fillna(), в который можно передать заранее вычисленное среднее через mean(). Этот подход сохраняет структуру данных и не требует сложных преобразований. Например, df['price'].fillna(df['price'].mean(), inplace=True) заменит все пропуски в столбце price средним значением без создания копии таблицы.
Если данные содержат несколько категорий, важно рассчитать среднее внутри каждой группы. Для этого применяют комбинацию методов groupby() и transform(), что позволяет учитывать контекст и не искажать результаты. Такой способ особенно полезен при работе с продажами, медицинскими измерениями и другими данными, где усреднение должно происходить в пределах категории.
Перед заменой NaN рекомендуется проверить количество пропусков через isna().sum() и убедиться, что замена не повлияет на распределение значений. После обработки стоит пересчитать базовые статистики и визуализировать изменения, чтобы оценить корректность результата.
Проверка наличия пропусков в данных с помощью функций isna и isnull

Перед заменой значений NaN необходимо точно определить, где именно присутствуют пропуски. В Pandas для этой задачи применяются функции isna() и isnull(), которые возвращают логическую маску с указанием ячеек, содержащих пропущенные значения. Оба метода полностью эквивалентны, поэтому можно использовать любой из них в зависимости от личных предпочтений.
Для быстрой оценки ситуации по всему набору данных удобно вызвать df.isna().sum(). Этот вызов покажет количество пропусков по каждому столбцу, что помогает определить, где требуется обработка. Если необходимо получить общую сумму пропусков в таблице, используется выражение df.isna().sum().sum().
Чтобы вывести конкретные строки с пропущенными значениями, применяют фильтрацию: df[df['column'].isna()]. Такой подход позволяет не только выявить проблемные записи, но и оценить, насколько систематичен характер пропусков – например, связаны ли они с определённой категорией данных.
При работе с крупными наборами данных полезно использовать метод info(), который показывает общее количество непустых значений по каждому столбцу. Это помогает быстро понять масштаб проблемы до перехода к дальнейшей обработке и заполнению NaN средними значениями.
Расчет среднего значения по столбцу с пропусками
После выявления пропусков необходимо вычислить среднее значение, которое будет подставлено вместо NaN. В Pandas для этого используется метод mean(), автоматически исключающий пропущенные элементы из расчёта. Например, выражение df['age'].mean() возвращает среднее значение по всем непустым записям столбца age.
По умолчанию mean() игнорирует NaN, поэтому не требуется предварительная фильтрация данных. Это упрощает вычисления, особенно при работе с большими таблицами. Если необходимо рассчитать среднее для всех числовых столбцов одновременно, применяется df.mean(numeric_only=True). Параметр numeric_only гарантирует, что расчёт будет выполнен только по числовым данным, без попыток усреднить текстовые поля.
При расчёте средних в наборах данных с выраженными выбросами стоит рассмотреть использование медианы: df['column'].median(). Сравнение этих двух показателей помогает определить, не смещено ли среднее значение из-за экстремальных чисел. В дальнейшем для заполнения пропусков можно выбрать наиболее устойчивый вариант.
Перед подстановкой среднего рекомендуется округлить результат до нужного количества знаков при помощи round(), чтобы сохранить единообразие представления данных и избежать накопления погрешностей при последующих операциях.
Замена NaN на среднее с использованием метода fillna
После вычисления среднего значения по столбцу его можно использовать для замены пропусков через метод fillna(). Этот метод подставляет заданное значение вместо NaN, сохраняя остальные данные без изменений. Например, выражение df['salary'].fillna(df['salary'].mean(), inplace=True) заменит все пропуски в столбце salary средним значением и обновит таблицу без создания копии.
Если требуется обработать несколько столбцов, можно передать в fillna() словарь, где ключи – имена столбцов, а значения – соответствующие средние. Пример: df.fillna({'age': df['age'].mean(), 'score': df['score'].mean()}, inplace=True). Такой подход позволяет точно контролировать подстановку и не затрагивать другие поля.
Для временного применения замены, без изменения исходных данных, метод fillna() можно использовать без параметра inplace=True, присвоив результат новой переменной. Это удобно, если необходимо протестировать разные стратегии заполнения пропусков и сравнить результаты.
После выполнения замены стоит проверить, что пропуски действительно устранены: df.isna().sum() должен возвращать нули для обработанных столбцов. Такая проверка исключает случаи, когда в таблице могли остаться нераспознанные значения, отличные от стандартного NaN.
Замена пропусков в нескольких столбцах одновременно
Когда таблица содержит несколько числовых столбцов с пропусками, целесообразно заменить NaN в них одновременно. В Pandas это выполняется с помощью метода fillna() и словаря, где каждому столбцу соответствует рассчитанное среднее значение.
Алгоритм действий:
- Определить список нужных столбцов:
cols = ['age', 'income', 'score']. - Вычислить средние значения для каждого из них:
means = df[cols].mean(). - Передать результат в метод
fillna():df.fillna(means, inplace=True).
Такой способ позволяет обработать все выбранные столбцы за один вызов, не дублируя код. Метод корректно сопоставляет имена столбцов и подставляет рассчитанные значения только в соответствующие поля.
При работе с большим количеством столбцов полезно использовать select_dtypes() для выбора только числовых данных перед заменой:
num_cols = df.select_dtypes(include='number').columnsdf[num_cols] = df[num_cols].fillna(df[num_cols].mean())
Этот подход предотвращает ошибки при наличии текстовых полей и обеспечивает корректное заполнение всех числовых столбцов без дополнительных проверок.
Использование метода transform для групповой замены NaN

Если данные содержат категории, внутри которых средние значения различаются, необходимо выполнять замену NaN по группам. В Pandas это реализуется с помощью комбинации методов groupby() и transform(), что позволяет рассчитать среднее отдельно для каждой группы и применить его к соответствующим строкам.
Пример кода для замены пропусков по группам:
df['value'] = df.groupby('region')['value'].transform(lambda x: x.fillna(x.mean()))
В этом примере среднее значение рассчитывается отдельно для каждой категории region, и все пропуски в столбце value заменяются на среднее по своей группе. Метод transform() возвращает серию той же длины, что и исходная, что делает его совместимым с присвоением без дополнительных объединений.
При необходимости обработать несколько столбцов можно использовать цикл:
for col in ['price', 'quantity']:
df[col] = df.groupby('category')[col].transform(lambda x: x.fillna(x.mean()))
Такой подход сохраняет статистическую структуру данных и предотвращает искажение усреднённых значений между разными группами. После выполнения рекомендуется проверить корректность замены через df.isna().sum(), чтобы убедиться в отсутствии необработанных пропусков.
Работа с пропусками в числовых и категориальных данных отдельно
Обработка пропусков в числовых и категориальных столбцах требует разных подходов. Для числовых данных обычно используют замену NaN на среднее или медиану с помощью fillna() и методов mean() или median(). Например: df['salary'].fillna(df['salary'].mean(), inplace=True).
В категориальных столбцах подстановкой среднего пользоваться нельзя, вместо этого применяют наиболее частое значение (mode) или создают отдельную категорию для пропусков. Пример: df['department'].fillna(df['department'].mode()[0], inplace=True). Такой способ сохраняет смысл категорий и предотвращает искажение данных.
Для автоматизации обработки разных типов столбцов можно использовать фильтрацию по типу данных:
num_cols = df.select_dtypes(include='number').columns
cat_cols = df.select_dtypes(include='object').columns
Далее пропуски заменяются отдельно для каждого типа:
df[num_cols] = df[num_cols].fillna(df[num_cols].mean())
df[cat_cols] = df[cat_cols].fillna(df[cat_cols].mode().iloc[0])
Такой подход обеспечивает корректное заполнение пропусков без смешивания логики числовых и категориальных данных, что важно для последующего анализа и построения моделей.
Контроль корректности после замены пропусков
После замены значений NaN на среднее важно убедиться, что операция прошла корректно и не повлияла на целостность данных. Для проверки используют методы подсчета пропусков и анализ базовых статистик.
Пример проверки количества пропусков по столбцам:
df.isna().sum()
Результаты удобно оформить в виде таблицы для наглядности:
| Столбец | Количество пропусков до замены | Количество пропусков после замены |
|---|---|---|
| age | 12 | 0 |
| salary | 5 | 0 |
| score | 8 | 0 |
Для числовых столбцов также проверяют минимальные, максимальные и средние значения с помощью df.describe(), чтобы убедиться, что замена не создала некорректные аномалии. В случае групповой замены рекомендуется сравнить статистику до и после операции для каждой категории.
Если в таблице остаются пропуски, это может указывать на нестандартные значения (NaN в другой кодировке), которые нужно обработать отдельно. Регулярная проверка позволяет поддерживать корректность данных для анализа и моделирования.
Автоматизация процедуры заполнения NaN в DataFrame

Для больших наборов данных ручная замена пропусков в каждом столбце может быть неудобной. В Pandas процесс можно автоматизировать с помощью цикла или функции, которая определяет тип данных и подставляет среднее для числовых столбцов.
Пример алгоритма автоматизации:
- Выбрать числовые столбцы:
num_cols = df.select_dtypes(include='number').columns. - Вычислить средние значения:
means = df[num_cols].mean(). - Заменить пропуски:
df[num_cols] = df[num_cols].fillna(means). - Проверить корректность:
df[num_cols].isna().sum().
Для обработки категориальных данных можно добавить автоматическую подстановку моды:
- Выбрать категориальные столбцы:
cat_cols = df.select_dtypes(include='object').columns. - Заполнить пропуски модой:
df[cat_cols] = df[cat_cols].fillna(df[cat_cols].mode().iloc[0]).
Также можно объединить эти шаги в функцию для повторного использования:
def fill_missing(df):
num_cols = df.select_dtypes(include='number').columns
cat_cols = df.select_dtypes(include='object').columns
df[num_cols] = df[num_cols].fillna(df[num_cols].mean())
df[cat_cols] = df[cat_cols].fillna(df[cat_cols].mode().iloc[0])
return df
Автоматизация позволяет быстро обрабатывать новые таблицы без ручного расчета и обеспечивает единообразие заполнения пропусков во всех числовых и категориальных столбцах.
Вопрос-ответ:
Почему значения NaN появляются в DataFrame и как их быстро обнаружить?
Значения NaN возникают при объединении таблиц, импорте данных из внешних источников или удалении некорректных записей. Для обнаружения пропусков применяют методы isna() и isnull(), которые возвращают логическую маску по всей таблице. Для подсчета пропусков по столбцам используют df.isna().sum(), а для общей суммы df.isna().sum().sum(). Эти методы помогают оценить масштаб пропусков до их замены.
Как правильно рассчитать среднее значение для замены пропусков в числовом столбце?
Для числовых столбцов среднее вычисляется с помощью метода mean(), который автоматически игнорирует NaN. Например, df['age'].mean() возвращает среднее значение всех непустых записей столбца age. Если столбец содержит выбросы, можно использовать медиану через median(), чтобы подставляемое значение не искажало распределение данных.
Как заменить пропуски на среднее значение сразу в нескольких столбцах?
Для одновременной замены пропусков в нескольких столбцах создают словарь, где ключи — названия столбцов, а значения — соответствующие средние. Пример: df.fillna({'age': df['age'].mean(), 'salary': df['salary'].mean()}, inplace=True). Для большого числа числовых столбцов можно использовать фильтрацию select_dtypes(include='number') и подставить средние через df[num_cols] = df[num_cols].fillna(df[num_cols].mean()).
Как учитывать категории при заполнении NaN средним значением?
Если данные разделены на категории, замену пропусков проводят отдельно для каждой группы с помощью groupby() и transform(). Пример: df['value'] = df.groupby('region')['value'].transform(lambda x: x.fillna(x.mean())). Это позволяет сохранять различия между группами и не искажать усредненные значения по всей таблице. Для нескольких столбцов алгоритм повторяют в цикле.
