Python: как обрабатывать отсутствующие данные в Pandas DataFrame

Введение Pandas [https://pandas.pydata.org/] - это библиотека Python для анализа и обработки данных. Почти все операции в pandas вращаются вокруг DataFrames, абстрактной структуры данных, специально созданной для обработки метрической тонны данных. В вышеупомянутой метрической тонне данных некоторые из них должны отсутствовать по разным причинам. В результате отсутствует значение (null / None / Nan) в нашем DataFrame. Вот почему в этой статье мы обсудим, как обрабатывать отсутствующие данные в Pandas DataFram.

Вступление

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

Настройка отсутствующих значений данных

В нашем наборе данных мы хотим рассматривать их как отсутствующие значения:

  1. Значение 0 в столбце Salary
  2. Значение 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 

Это приводит к:

индивидуальный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, отбросьте эту метку
1
<!-- -->
 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') 

Заключение

Очистка и предварительная обработка данных - очень важная часть каждого анализа данных и каждого проекта в области науки о данных.

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

comments powered by Disqus