Руководство по использованию метода fillna в Pandas для работы с отсутствующими данными в DataFrame

Добро пожаловать в наше подробное руководство по использованию метода Pandas fillna! Обработка отсутствующих данных является важным шагом в процессе очистки данных. Это обеспечивает надежность, точность и консистентность ваших аналитических результатов. К счастью, использование метода Pandas .fillna() может сделать работу с такими неприятными значениями, как “NaN” или “null”, очень простой. В этом руководстве мы подробно рассмотрим .fillna(), охватывая его параметры, использование и различные способы, которые помогут вам сохранить целостность ваших данных.

К концу этого руководства вы узнаете следующее:

  • Что такое метод Pandas .fillna() и почему он важен для обработки недостающих данных

  • Подробные описания и варианты использования каждого параметра .fillna().

  • Различные способы заполнения недостающих данных с помощью .fillna(), например прямое заполнение или обратное заполнение.

  • Ответы на часто задаваемые вопросы об использовании .fillna()

Хотите вместо этого узнать, как удалить недостающие данные? Ознакомьтесь с моим полным руководством по методу Dropna Pandas, который обеспечивает огромную гибкость при удалении недостающих данных.

Оглавление

Понимание метода fillna() в Pandas

Прежде чем начать использовать метод .fillna() библиотеки Pandas, давайте на момент остановимся и разберемся, как работает этот метод. В следующем блоке кода детализированы различные доступные параметры метода:

# Понимание метода fillna() в Pandas
import pandas as pd
df = pd.DataFrame()
df.fillna(value=None, *, method=None, axis=None, inplace=False, limit=None, downcast=None)

Давайте более подробно рассмотрим параметры и аргументы по умолчанию, используя метод .fillna(). В таблице ниже приведено разбиение каждого из параметров этого метода, а также их значения по умолчанию и принимаемые значения:

Параметр
Описание
Значение по умолчанию
Принятые значения

value

Указывает значения, которые будут использоваться для заполнения недостающих данных.

None

Scalar, dict, Series, or DataFrame

method

Указывает метод заполнения недостающих данных (заполнение вперед или заполнение назад).

None

‘pad’ or ‘ffill’ (forward fill), ‘bfill’ or ‘backfill’ (backward fill)

axis

Определяет ось, по которой заполняются недостающие значения (строки или столбцы)

0

0 (index/rows) or 1 (columns)

inplace

Если True, недостающие данные будут заполнены на месте без создания нового DataFrame.

False

True, False

limit

Устанавливает максимальное количество последовательных пропущенных значений для заполнения.

None

Positive integer value

downcast

При необходимости предоставьте словарь для преобразования заполненных значений в типы данных.

None

Dictionary in the form {‘column name’: ‘datatype’} or {‘column name’: ‘infer’} for inferring datatype from the other values

Теперь, когда вы ознакомились с различными параметрами метода .fillna(), давайте начнем изучение того, как использовать этот метод.

Загрузка образца DataFrame Pandas

Давайте посмотрим на DataFrame, который мы будем использовать в этом руководстве. Я намеренно сделал набор данных простым. По моему опыту, когда изучаешь что-то новое, лучше всего начинать с простого и постепенно переходить к более сложным случаям использования.

Давайте загрузим DataFrame, передав словарь данных:

# Загрузите образец набора данных
import pandas as pd
df = pd.DataFrame({
    "Name": ['Alice', 'Bob', None, 'David', None, 'Fiona', 'George'],
    "Age": [25, None, 23, 35, None, 31, 28],
    "Gender": ['F', 'M', 'M', None, 'F', 'F', 'M'],
    "Years": [3, None, None, None, 7, None, 2]
})

print(df.head())

# Возвращается:
#       Name   Age Gender  Years
# 0    Alice  25.0      F    3.0
# 1      Bob   NaN      M    NaN
# 2  Charlie  23.0      M    NaN
# 3    David  35.0   None    NaN
# 4      Eva   NaN      F    7.0

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

Использование Pandas fillna() для заполнения пропущенных значений в одном столбце DataFrame

Метод .fillna() в Pandas может быть применен к отдельному столбцу (или, точнее, к Pandas Series) для заполнения всех отсутствующих значений заданным значением. Чтобы заполнить отсутствующие значения, вы можете просто передать значение в параметр value=

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

Использование Pandas fillna() для заполнения 0

Чтобы заполнить все пропущенные значения в столбце Pandas нулями, вы можете использовать .fillna(0) и применить его к столбцу. Давайте посмотрим, как мы можем заполнить все отсутствующие значения в столбце Years

# Заполните пропущенные значения 0
df['Years'] = df['Years'].fillna(0)
print(df.head())

# Возвращается:
#     Name   Age Gender  Years
# 0  Alice  25.0      F    3.0
# 1    Bob   NaN      M    0.0
# 2   None  23.0      M    0.0
# 3  David  35.0   None    0.0
# 4   None   NaN      F    7.0

В приведенном выше коде мы применили метод .fillna() к столбцу Years. Обратите внимание, что здесь мы переназначили столбец, тем самым перезаписав оригинальный объект Pandas Series.

Использование Pandas fillna() для заполнения постоянным значением

Чтобы заполнить все пропущенные значения в колонке Pandas постоянным значением, мы просто передаем это значение в параметр value= метода .fillna(). Значение будет пытаться соответствовать типу данных колонки.

Давайте посмотрим, как мы можем заполнить все пропущенные значения в столбце Age значением

# Заполните пропущенные значения постоянным значением
df['Age'] = df['Age'].fillna(99)
print(df.head())

# Возвращается:
#     Name   Age Gender  Years
# 0  Alice  25.0      F    3.0
# 1    Bob  99.0      M    NaN
# 2   None  23.0      M    NaN
# 3  David  35.0   None    NaN
# 4   None  99.0      F    7.0

В приведенном выше примере мы заполнили все пропущенные значения в столбце 'Age' значением 99. Однако на практике мы редко будем действовать именно так для восстановления отсутствующих данных. Давайте рассмотрим, как можно заменить пропущенные значения на среднее (или среднее арифметическое) значение столбца.

Использование Pandas fillna() для заполнения средним значением

Чтобы заполнить все пропущенные значения столбца средним значением этого столбца, вы можете использовать метод .fillna() с средним значением этого столбца. Давайте посмотрим, как мы можем использовать метод Pandas .mean() для замены отсутствующих значений на среднее:

# Заполните пропущенные значения средним значением столбца
df['Age'] = df['Age'].fillna(df['Age'].mean())
print(df.head())

# Возвращается:
#     Name   Age Gender  Years
# 0  Alice  25.0      F    3.0
# 1    Bob  28.4      M    NaN
# 2   None  23.0      M    NaN
# 3  David  35.0   None    NaN
# 4   None  28.4      F    7.0

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

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

Использование Pandas fillna() для заполнения строкой

Аналогично, мы можем передать строку, чтобы заполнить все отсутствующие значения данной строкой. Это работает так же, как передача константы. Давайте посмотрим, как мы можем передать строку 'Missing', чтобы заполнить все отсутствующие значения в столбце 'Name'

# Заполните пропущенные значения строкой
df['Name'] = df['Name'].fillna('Missing')
print(df.head())

# Возвращается:
#       Name   Age Gender  Years
# 0    Alice  25.0      F    3.0
# 1      Bob   NaN      M    NaN
# 2  Missing  23.0      M    NaN
# 3    David  35.0   None    NaN
# 4  Missing   NaN      F    7.0

Это работает так же, как и наши предыдущие примеры. Обратите внимание, что если мы передадим строку в столбец, который является числовым (таким как целое число или число с плавающей точкой), то тип данных всего столбца изменится на object

Использование Pandas fillna() для заполнения пропущенных значений во всем DataFrame

Чтобы заполнить пропущенные значения во всем DataFrame Pandas, мы можем просто передать значение заполнения в параметр value= метода .fillna(). Метод попытается сохранить тип данных исходного столбца, если это возможно.

Давайте посмотрим, как мы можем заполнить все пропущенные значения в DataFrame значением

# Заполнение недостающих значений в фрейме данных Pandas одним значением
df = df.fillna(0)
print(df.head())

# Возвращается:
#     Name   Age Gender  Years
# 0  Alice  25.0      F    3.0
# 1    Bob   0.0      M    0.0
# 2      0  23.0      M    0.0
# 3  David  35.0      0    0.0
# 4      0   0.0      F    7.0

Мы можем видеть в приведенном выше коде, что при передаче одного значения в метод .fillna(), это значение передается в каждый столбец. Примечательно, что типы данных корректируются так, чтобы они соответствовали типам данных столбца.

Использование Pandas fillna() для заполнения пропущенных значений в определенных столбцах DataFrame

До сих пор мы рассматривали заполнение отсутствующих данных либо для одного столбца за раз, либо для всего DataFrame. Pandas позволяет передавать словарь пар столбец-значение для заполнения отсутствующих значений в идентифицированных столбцах определенными значениями

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

Давайте посмотрим, как мы можем использовать этот подход для заполнения пропущенных значений различными значениями:

# Заполните пропущенные значения в определенных столбцах DataFrame
df = df.fillna({
    'Name': 'Missing',
    'Age': df['Age'].mean(),
    'Years': 0
})

print(df.head())

# Возвращается:
#       Name   Age Gender  Years
# 0    Alice  25.0      F    3.0
# 1      Bob  28.4      M    0.0
# 2  Missing  23.0      M    0.0
# 3    David  35.0   None    0.0
# 4  Missing  28.4      F    7.0

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

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

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

Использование Pandas fillna() для обратного или прямого заполнения данных

Метод .fillna() в Pandas также позволяет заполнять пропуски в ваших данных, используя предыдущие или следующие наблюдения. Этот процесс называется прямым заполнением или обратным заполнением данных.

При выполнении этого у нас есть следующие варианты для передачи в параметр method=

  • 'ffill' или 'pad' будут использовать предыдущее значение для заполнения пропусков в данных.

  • 'bfill' или 'backfill' будут использовать следующее значение для заполнения пропущенных значений в пробеле.

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

# Переслать недостающие данные, используя .fillna()
df['Years'] = df['Years'].fillna(method='ffill')
print(df)

# Возвращается:
#      Name   Age Gender  Years
# 0   Alice  25.0      F    3.0
# 1     Bob   NaN      M    3.0
# 2    None  23.0      M    3.0
# 3   David  35.0   None    3.0
# 4    None   NaN      F    7.0
# 5   Fiona  31.0      F    7.0
# 6  George  28.0      M    2.0

В приведенном выше блоке кода мы применяем .fillna(method='ffill') к столбцу 'Years'. Обратите внимание, что все пропуски заполняются последним значением, которое было перед пропуском. Этот подход особенно полезен для временных рядов.

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

Ограничение количества последовательных пропущенных данных, заполняемых с помощью Pandas fillna()

При использовании параметра method= метода .fillna(), вы можете не захотеть заполнять весь пробел в ваших данных. Используя параметр limit=, вы можете указать максимальное количество последовательных пропущенных значений, которые будут заполнены вперёд или назад

Давайте посмотрим, как мы можем использовать этот параметр, чтобы ограничить количество значений, заполняемых в пропуске в наших данных:

# Ограничение количества заполняемых данных
df['Years'] = df['Years'].fillna(method='ffill', limit=2)
print(df)

# Возвращается:
#      Name   Age Gender  Years
# 0   Alice  25.0      F    3.0
# 1     Bob   NaN      M    3.0
# 2    None  23.0      M    3.0
# 3   David  35.0   None    NaN
# 4    None   NaN      F    7.0
# 5   Fiona  31.0      F    7.0
# 6  George  28.0      M    2.0

В приведенном выше примере мы использовали тот же метод для заполнения пропущенных данных в нашем наборе данных. Однако мы указали, что хотим заполнить максимум две пропущенные записи, передав параметр limit=2. Мы видим, что третье отсутствующее значение в промежутке не заполнено.

Для работы этого параметра передаваемое значение должно быть больше 0 и не равно None

Использование Pandas fillna() с группировкой и преобразованием

В этом разделе мы рассмотрим использование метода .fillna() в библиотеке Pandas для заполнения пропущенных данных в различных категориях. Помните наш предыдущий пример, когда мы заполнили отсутствующие данные в столбце Возраст, используя среднее значение по этому столбцу.

Чтобы сделать заполненные значения более репрезентативными, можно разделить данные по группам. Например, мы можем заполнить данные, предоставляя отсутствующие данные для каждой группы в колонке "Пол".

Для этого мы используем метод groupby в Pandas для расчета среднего возраста каждой группы, затем передаем эти значения обратно в DataFrame с использованием метода

# Рассчитайте средний возраст для каждого пола
mean_age_by_gender = df.groupby('Gender')['Age'].transform('mean')

# Заполните недостающие значения возраста средним возрастом каждого пола.
df['Age'] = df['Age'].fillna(mean_age_by_gender)
print(df)

# Возвращается:
# Name   Age Gender  Years
# 0    Alice  25.0      F    3.0
# 1      Bob  25.5      M    NaN
# 2     None  23.0      M    NaN
# 3    David  35.0   None    NaN
# 4     None  28.0      F    7.0
# 5    Fiona  31.0      F    NaN
# 6  George   28.0      M    2.0

В приведенном выше примере мы сначала вычислили средний возраст по полу и создали результирующий Series, в котором эти значения были сопоставлены с индексом. Затем мы использовали метод .fillna() для передачи этого Series для заполнения всех отсутствующих данных.

Использование Pandas fillna() для заполнения недостающих данных на месте

До сих пор мы рассматривали использование метода .fillna() в Pandas, присваивая либо сам DataFrame, либо объект Pandas Series самому себе.

Метод .fillna() позволяет заполнить пропущенные значения на месте, установив параметр inplace=True. На моем опыте, существует определенная степень споров о том, быстрее ли этот подход или более эффективен с точки зрения использования памяти.

Я предпочитаю выполнять операции, переназначая DataFrame/Series, поскольку это может использоваться более консистентно.

Давайте посмотрим, как мы можем заполнить отсутствующие значения на месте, используя метод .fillna()

# Заполните пропущенные значения на месте
df['Name'].fillna('Missing', inplace=True)
print(df.head())

# Возвращается:
#       Name   Age Gender  Years
# 0    Alice  25.0      F    3.0
# 1      Bob   NaN      M    NaN
# 2  Missing  23.0      M    NaN
# 3    David  35.0   None    NaN
# 4  Missing   NaN      F    7.0

Используя аргумент inplace=True, нам не потребовалось переназначать столбец самому себе.

Часто задаваемые вопросы

В чем разница между fillna и dropna в Pandas?

В Pandas DataFrame или Series существуют методы для обработки отсутствующих данных: fillna и dropna, работающие по-разному. fillna заменяет отсутствующие значения (NaN или None) на указанные значения, в то время как dropna удаляет строки или столбцы, содержащие отсутствующие значения. Как правило, используйте fillna, когда вы хотите сохранить форму и размер вашего набора данных, заполняя пропущенные данные. С другой стороны, выбирайте dropna, когда предпочитаете полностью удалить данные с пропущенными значениями.

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

Чтобы заполнить пропущенные значения средним, медианой или модой столбца, просто передайте соответствующую статистическую меру в параметр 'value' метода .fillna()

Могу ли я использовать fillna для определенного подмножества столбцов или строк в моем DataFrame?

Да, вы можете применить fillna к подмножеству столбцов или строк. Для выполнения этой операции используйте функцию DataFrame.loc для выбора подмножества, над которым вы хотите работать, а затем примените .fillna()

Заключение

В этом подробном руководстве мы исследовали возможности метода fillna в Pandas для работы с отсутствующими данными. Вкратце, мы рассмотрели следующее:

  1. Важность обработки недостающих данных и роль метода Pandas fillna в этом процессе.

  2. Различные параметры метода fillna и их использование, такие как значение, метод, ось, место и предел.

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

Помните, что эффективная обработка отсутствующих данных имеет решающее значение для обеспечения точности и согласованности вашего анализа данных. Не стесняйтесь обращаться к этому руководству, если вам нужна помощь или вдохновение при работе с отсутствующими данными в ваших будущих проектах. Удачи и счастливой очистки данных!

Чтобы узнать больше о методе .fillna() библиотеки Pandas, ознакомьтесь с официальной документацией.

Last updated