Вступление
Pandas - это библиотека Python для анализа
и обработки данных. Почти все операции в pandas
вращаются вокруг
DataFrame
s, абстрактной структуры данных, специально созданной для
обработки метрической тонны данных.
В вышеупомянутой метрической тонне данных некоторые из них должны
отсутствовать по разным причинам. В результате отсутствует значение (
null
/ None
/ Nan
) в нашем DataFrame
.
Вот почему в этой статье мы обсудим, как обрабатывать отсутствующие
данные в Pandas DataFrame
.
Проверка данных
Наборы данных в реальном мире редко бывают идеальными. Они могут содержать отсутствующие значения, неправильные типы данных, нечитаемые символы, ошибочные строки и т. Д.
Первым шагом к правильному анализу данных является очистка и организация данных, которые мы будем использовать позже. Мы обсудим несколько распространенных проблем, связанных с данными, которые могут возникнуть в наборе данных.
Для этого мы будем работать с набором данных о небольших сотрудниках.
.csv
выглядит так:
First Name,Gender,Salary,Bonus %,Senior Management,Team
Douglas,Male,97308,6.945,TRUE,Marketing
Thomas,Male,61933,NaN,TRUE
Jerry,Male,NA,9.34,TRUE,Finance
Dennis,na,115163,10.125,FALSE,Legal
,Female,0,11.598,,Finance
Angela,,,18.523,TRUE,Engineering
Shawn,Male,111737,6.414,FALSE,na
Rachel,Female,142032,12.599,FALSE,Business Development
Linda,Female,57427,9.557,TRUE,Client Services
Stephanie,Female,36844,5.574,TRUE,Business Development
,,,,,
Импортируем его в DataFrame
:
df = pd.read_csv('out.csv')
df
Это приводит к:
{.ezlazyload}
Присмотревшись в наборе данных, мы отмечаем , что панды автоматически
присваивают NaN
, если значение для конкретного столбца является
пустой строкой ''
NA
или NaN
. Однако бывают случаи, когда
отсутствующие значения представлены настраиваемым значением, например
строкой 'na'
или 0
для числового столбца.
Например, 6-я строка имеет значение na
для Team
, а 5-я строка имеет
значение 0
для столбца Salary
Настройка отсутствующих значений данных
В нашем наборе данных мы хотим рассматривать их как отсутствующие значения:
- Значение
0
в столбцеSalary
- Значение
na
в столбцеTeam
Этого можно добиться, используя na_values
для установки
пользовательских пропущенных значений. Этот аргумент представляет
словарь, где ключи представляют имя столбца, а значение представляет
значения данных, которые следует рассматривать как отсутствующие:
# This means that in Salary column, 0 is also considered a missing value.
# And 'na' is considered a missing value in the Team column.
df = pd.read_csv('out.csv', na_values={"Salary" : [0], "Team" : ['na']})
df
Это приводит к:
{.ezlazyload}
С другой стороны, если мы хотим отобразить список значений, которые
должны рассматриваться как отсутствующие значения во всех столбцах, мы
можем передать список кандидатов, которые мы хотим глобально
рассматривать как отсутствующие значения, в параметр na_values
missing_values = ["na","NA","n/a", "na", 0]
df = pd.read_csv('out.csv', na_values = missing_values)
df
Это приводит к:
{.ezlazyload}
Обратите внимание, что здесь значение Gender
в 4-й строке NaN
поскольку мы определили na
как отсутствующее значение выше.
Выбор реализации зависит от характера набора данных.
Например, для некоторых числовых столбцов в наборе данных может
потребоваться трактовка 0
как отсутствующего значения, а для других
столбцов - нет. Следовательно, вы можете использовать первый подход,
когда вы настраиваете отсутствующие значения на основе столбцов.
Точно так же, если мы хотим обрабатывать 0
например, как отсутствующее
значение в глобальном масштабе, мы можем использовать второй метод и
просто передать массив таких значений аргументу na_values
После того, как мы определили все недостающие значения в DataFrame
и
правильно аннотировали их, есть несколько способов обработки недостающих
данных.
Удаление строк с пропущенными значениями
Один из подходов - удалить все строки, содержащие пропущенные значения.
Это легко сделать с помощью специально предназначенной для этого функции
dropna()
# Drops all rows with NaN values
df.dropna(axis=0,inplace=True)
Это приводит к:
{.ezlazyload}
inplace = True
вносит все изменения в существующий DataFrame
не
возвращая новый. Без него вам пришлось бы переназначить DataFrame
самому себе.
axis
указывает, работаете ли вы со строками или столбцами: 0
-
строки, а 1
- столбцы.
Вы можете контролировать , хотите ли вы удалить строки , содержащие по
меньшей мере , 1 NaN
или все NaN
значения, установив , how
параметр в dropna
методе.
как : {â € ˜anyâ € ™, â € ˜allâ € ™}
any
: если присутствуют какие-либо значения NA, отбросьте эту меткуall
: если все значения - NA, отбросьте эту метку
|
|
df.dropna(axis=0,inplace=True, how='all')
Это приведет к удалению только последней строки из набора данных,
поскольку how=all
удалит строку только в том случае, если все значения
отсутствуют в строке.
Точно так же, чтобы удалить столбцы, содержащие пропущенные значения,
просто установите axis=1
в методе dropna
Заполнение недостающих значений
Возможно, это не лучший подход для удаления строк, содержащих пропущенные значения, если таких строк много. Они могут содержать ценные данные в других столбцах, и мы не хотим искажать данные в сторону неточного состояния.
В этом случае у нас есть несколько вариантов присвоения подходящих значений. Наиболее распространенные из них перечислены ниже:
- Заполните NA средним, медианным или режимом данных
- Заполните NA постоянным значением
- Прямое заполнение или обратное заполнение Нет данных
- Интерполировать данные и заполнить NA
Давайте рассмотрим их один за другим.
Заполните отсутствующие значения DataFrame с помощью среднего значения столбца, медианы и режима
Начнем с fillna()
. Значения, отмеченные NA, заполняются значениями,
которые вы предоставили для метода.
Например, вы можете использовать функции .median()
, .mode()
и
.mean()
для столбца и указать их в качестве значения заполнения:
# Using median
df['Salary'].fillna(df['Salary'].median(), inplace=True)
# Using mean
df['Salary'].fillna(int(df['Salary'].mean()), inplace=True)
# Using mode
df['Salary'].fillna(int(df['Salary'].mode()), inplace=True)
Теперь, если зарплата отсутствует в строках человека, для заполнения этого значения используются среднее значение, мода или медиана. Таким образом, вы не исключаете этих людей из набора данных и не искажаете значения заработной платы.
Хотя этот метод и не идеален, он позволяет вам вводить значения, которые не влияют на общий набор данных, поскольку независимо от того, сколько средних вы добавляете, среднее остается неизменным.
Заполните отсутствующие значения DataFrame константой
Вы также можете решить заполнить значения с пометкой NA постоянным значением. Например, вы можете ввести специальную строку или числовое значение:
df['Salary'].fillna(0, inplace=True)
По крайней мере, эти значения теперь являются фактическими значениями, а
не na
или NaN
.
Прямое заполнение отсутствующих значений фрейма данных
Этот метод заполнит пропущенные значения первым не пропущенным значением, которое встречается перед ним:
df['Salary'].fillna(method='ffill', inplace=True)
Обратное заполнение отсутствующих значений фрейма данных
Этот метод заполняет отсутствующие значения первым неотсутствующим значением, которое появляется после него:
df['Salary'].fillna(method='bfill', inplace=True)
Заполните отсутствующие значения DataFrame с помощью интерполяции
Наконец, этот метод использует математическую интерполяцию, чтобы определить, какое значение было бы на месте отсутствующего значения:
df['Salary'].interpolate(method='polynomial')
Заключение
Очистка и предварительная обработка данных - очень важная часть каждого анализа данных и каждого проекта в области науки о данных.
В этой статье мы рассмотрели несколько методов обработки недостающих данных, включая настройку недостающих значений данных и вменение значений отсутствующих данных с использованием различных методов, включая среднее значение, медиана, режим, постоянное значение, прямое заполнение, обратное заполнение и интерполяция.