Базовая очистка данных с помощью Pandas

PandasBeginner
Практиковаться сейчас

Введение

Добро пожаловать в лабораторную работу по базовой очистке данных с помощью Pandas. Очистка данных является важнейшим первым шагом в любом проекте анализа данных или машинного обучения. Реальные данные часто бывают "грязными", содержат пропущенные значения, дублирующиеся записи или некорректные типы данных. Использование необработанных, неочищенных данных может привести к неточным анализам и ненадежным выводам.

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

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

  • Удалении строк с пропущенными значениями с помощью dropna().
  • Заполнении пропущенных значений с помощью fillna().
  • Удалении дублирующихся строк с помощью drop_duplicates().
  • Переименовании столбцов с помощью rename().
  • Преобразовании типов данных столбцов с помощью astype().

К концу этой лабораторной работы вы получите твердое понимание основного рабочего процесса очистки данных в Pandas.

Удаление строк методом dropna

На этом шаге вы узнаете, как обрабатывать пропущенные данные, удаляя строки, содержащие нулевые значения. В Pandas пропущенные данные представлены как NaN (Not a Number). Одной из самых простых стратегий обработки значений NaN является удаление строк или столбцов, которые их содержат.

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

Сначала давайте запустим начальный скрипт, чтобы увидеть наш исходный DataFrame. Установочный скрипт уже создал файл с именем main.py в каталоге ~/project.

Откройте терминал в WebIDE и выполните следующую команду:

python3 main.py

Вы должны увидеть исходный DataFrame, который содержит значения NaN в столбцах age и city.

Original DataFrame:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000
5      Eva   NaN       Boston         90000
6    Frank  45.0          NaN        100000

Original DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 4 columns):
 ##   Column         Non-Null Count  Dtype
---  ------         --------------  -----
 0   name           7 non-null      object
 1   age            6 non-null      float64
 2   city           6 non-null      object
 3   SALARY_IN_USD  7 non-null      object
dtypes: float64(1), object(3)
memory usage: 352.0+ bytes

Теперь давайте используем dropna(), чтобы увидеть, как он работает. Откройте файл main.py из файлового проводника на левой панели. Добавьте следующий код в конец файла. Этот код создаст новый DataFrame df_dropped с удаленными строками, содержащими NaN, и выведет его. Мы пока не изменяем исходный df, чтобы иметь возможность изучить другие методы на следующих шагах.

## Add this to the end of main.py

print("\nDataFrame after dropping rows with any missing values:")
df_dropped = df.dropna()
print(df_dropped)

Сохраните файл (Ctrl+S или Cmd+S) и снова запустите его из терминала:

python3 main.py

Вывод теперь будет включать новый раздел, показывающий DataFrame после удаления строк со значениями NaN (строки для Eva и Frank).

## ... (previous output) ...

DataFrame after dropping rows with any missing values:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000

Заполнение пропущенных значений с помощью fillna

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

Вы можете заполнить значения NaN константой, например 0 или "Unknown", или вычисленным значением, например средним или медианой столбца.

Давайте изменим наш файл main.py. Вместо простого вывода DataFrame после удаления строк, мы теперь очистим наш основной DataFrame df, заполнив пропущенные значения. Мы заполним пропущенный age средним значением существующих возрастов, а пропущенный city — строкой 'Unknown'.

Удалите код dropna(), который вы добавили на предыдущем шаге, и замените его следующим кодом. Мы используем inplace=True для прямого изменения DataFrame.

## Replace the dropna() code with this at the end of main.py

## Calculate the mean of the 'age' column
mean_age = df['age'].mean()

## Fill missing values using the recommended approach to avoid FutureWarnings
df.fillna({'age': mean_age, 'city': 'Unknown'}, inplace=True)

print("\nDataFrame after filling missing values:")
print(df)

Аргумент inplace=True изменяет DataFrame на месте, что означает, что вам не нужно присваивать результат обратно переменной (например, df = df.fillna(...)).

Сохраните файл и запустите его из терминала:

python3 main.py

Вы увидите, что значения NaN были заменены. Возраст Евы теперь является средним значением других возрастов, а город Фрэнка — 'Unknown'.

## ... (original DataFrame output) ...

DataFrame after filling missing values:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
4    Alice  25.0     New York         50000
5      Eva  33.3       Boston         90000
6    Frank  45.0      Unknown        100000

Примечание: Средний возраст составляет (25+30+35+40+25+45)/6 = 33.33.... Pandas заполнит NaN этим значением. В приведенном выше выводе для простоты показано 35.0, ваш фактический вывод для возраста Евы будет рассчитанным средним значением.

Удаление дублирующихся строк с помощью drop_duplicates

На этом шаге вы узнаете, как удалять дублирующиеся строки из вашего DataFrame. Дублирующиеся данные могут исказить анализ и привести к неверным результатам. Метод drop_duplicates() помогает выявлять и удалять их.

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

По умолчанию drop_duplicates() считает строку дубликатом, если все значения ее столбцов идентичны значениям другой строки.

Добавьте следующий код в конец вашего скрипта main.py. Мы продолжим использовать inplace=True для изменения нашего DataFrame.

## Add this to the end of main.py

df.drop_duplicates(inplace=True)

print("\nDataFrame after dropping duplicates:")
print(df)

Сохраните файл и выполните его из терминала:

python3 main.py

Вывод теперь покажет DataFrame с 6 строками, поскольку одна из строк 'Alice' была удалена.

## ... (previous output) ...

DataFrame after dropping duplicates:
      name   age         city SALARY_IN_USD
0    Alice  25.0     New York         50000
1      Bob  30.0  Los Angeles         60000
2  Charlie  35.0     New York         70000
3    David  40.0      Chicago         80000
5      Eva  33.3       Boston         90000
6    Frank  45.0      Unknown        100000

Обратите внимание, что индекс 4 теперь отсутствует, что соответствует удаленной дублирующейся строке. DataFrame теперь содержит 6 уникальных строк.

Переименование столбцов с помощью метода rename

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

В нашем DataFrame есть столбец с именем SALARY_IN_USD. Давайте переименуем его в более простое имя в нижнем регистре: salary. Метод rename() идеально подходит для этого. Вы передаете словарь в аргумент columns, где ключами являются старые имена, а значениями — новые имена.

Добавьте следующий код в конец вашего скрипта main.py:

## Add this to the end of main.py

df.rename(columns={'SALARY_IN_USD': 'salary'}, inplace=True)

print("\nDataFrame after renaming columns:")
print(df)

Сохраните файл и запустите его из терминала:

python3 main.py

Вы увидите, что столбец SALARY_IN_USD был успешно переименован в salary.

## ... (previous output) ...

DataFrame after renaming columns:
      name   age         city   salary
0    Alice  25.0     New York    50000
1      Bob  30.0  Los Angeles    60000
2  Charlie  35.0     New York    70000
3    David  40.0      Chicago    80000
5      Eva  33.3       Boston    90000
6    Frank  45.0      Unknown   100000

Это простое изменение делает имя столбца более удобным для ввода и соответствует распространенному руководству по стилю Python.

Преобразование типов столбцов с помощью astype

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

Если вы посмотрите на начальный вывод df.info(), вы заметите, что столбец SALARY_IN_USD имел Dtype object, что означает, что числа хранились как строки. Мы не можем выполнять математические операции (например, вычисление средней зарплаты) со строками. Нам нужно преобразовать этот столбец в числовой тип, например int (целое число).

Для этой цели используется метод astype(). Давайте преобразуем наш новый столбец salary в тип int.

Добавьте следующий код в конец main.py. Мы также снова выведем информацию о DataFrame, чтобы подтвердить изменение.

## Add this to the end of main.py

df['salary'] = df['salary'].astype(int)

print("\nDataFrame after converting data types:")
print(df)

print("\nFinal DataFrame Info:")
df.info()

Сохраните файл и запустите его в последний раз:

python3 main.py

В окончательном выводе будет показан очищенный DataFrame и его новая информация. Внимательно посмотрите на Dtype для столбца salary в выводе информации. Теперь он должен быть int64, а не object.

## ... (previous output) ...

DataFrame after converting data types:
      name   age         city  salary
0    Alice  25.0     New York   50000
1      Bob  30.0  Los Angeles   60000
2  Charlie  35.0     New York   70000
3    David  40.0      Chicago   80000
5      Eva  33.3       Boston   90000
6    Frank  45.0      Unknown  100000

Final DataFrame Info:
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, 0 to 6
Data columns (total 4 columns):
 ##   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   name    6 non-null      object
 1   age     6 non-null      float64
 2   city    6 non-null      object
 3   salary  6 non-null      int64
dtypes: float64(1), int64(1), object(2)
memory usage: 240.0+ bytes

Поскольку столбец salary имеет целочисленный тип, теперь вы можете выполнять такие вычисления, как df['salary'].mean().

Резюме

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

В этой лабораторной работе вы изучили и отработали несколько основных методов очистки данных в Pandas:

  • Обработка пропущенных значений: Вы узнали, как удалять строки с NaN с помощью dropna() и как заполнять их значимыми данными с помощью fillna().
  • Удаление дубликатов: Вы использовали drop_duplicates() для устранения избыточных строк из вашего набора данных.
  • Переименование столбцов: Вы научились делать имена столбцов более последовательными и читаемыми с помощью метода rename().
  • Преобразование типов данных: Вы использовали astype() для изменения типа данных столбца на правильный формат, что позволяет проводить дальнейший анализ.

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