Ускоренный курс по науке о данных

Подробное руководство по пандам

Лучшая библиотека Python для работы с реляционными данными

Ранее в этом месяце мы с Эдвардом Цяном начали работу над комплексом уроков для начинающих специалистов по данным, которые можно найти на нашем сайте www.dscrashcourse.com.

Я буду размещать немного измененные уроки на Medium, чтобы сделать их доступными для более широкой аудитории. Если вы найдете эти статьи полезными, зайдите на сайт, чтобы получить больше уроков и практических задач!

pandas - это библиотека Python, которая упрощает чтение, экспорт и работу с реляционными данными. Этот урок расширит его функциональность и использование. Обычно мы import pandas as pd ссылаемся на библиотеку в сокращенной форме. Весь приведенный ниже код был написан на Python 3 с использованием pandas==0.24.2.

Панды серии

Из официальной документации Series - это одномерный массив ndarray с метками осей. ndarray - это особый тип данных в numpy library, который определяет массив элементов фиксированного размера. Проще говоря, серия - это столбец в таблице или электронной таблице с тем же типом данных. Каждая серия имеет индекс, используемый для обозначения меток осей.

Мы можем создать серию, используя pd.Series(['some', 'array', 'object'])

Индексирование серий

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

sample_series = pd.Series(['some', 'array', 'object'], index=list('abc'))
 
# positional indexing: this returns the first value, which is 'some'
sample_series[0]

# label indexing: this also returns the first value 'some'
sample_series['a']

Так выглядит sample_series.

Мы можем разрезать серию, чтобы получить диапазон значений. Поведение нарезки отличается при использовании меток осей - в отличие от обычных фрагментов Python, включаются как начальная, так и конечная точка!

# positional slicing: this returns the first two values sample_series[:2]  
# label slicing: this also returns the first two values
sample_series[:'b']

Панды DataFrames

DataFrames используются для определения двумерных данных. Строки помечаются индексами, а столбцы - заголовками. Каждый столбец можно интерпретировать как серию. Мы можем создать DataFrame, используя pd.DataFrame({'column 1': [1, 1], 'column 2': [2, 2]}).

В качестве альтернативы мы также можем считывать табличные данные в DataFrames.

# Read in a CSV file
csv_dataframe = pd.read_csv('my_csv_file.csv')
 
# Read in an Excel file
xls_dataframe = pd.read_excel('my_xls_file.xls')

Индексирование фреймов данных

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

sample_dataframe = pd.DataFrame({'column 1': [1, 1], 'column 2': [2, 2]})
 
# get the column 'column 1'
sample_dataframe['column 1']

Для более сложной индексации мы можем использовать .iloc или .loc.

  • loc - это подход к индексированию на основе меток, который требует имени строки (строк) и столбца (столбцов).
  • iloc - это позиционный подход к индексации, который требует расположения значений.

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

Мы можем получить первую строку, используя любое из них:

sample_dataframe.iloc[0, :]

sample_dataframe.loc[0, :]

Изучение синтетического набора данных с помощью Pandas

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

data = pd.DataFrame({'customer_id': [1,2,3,4,5,6,7,8], 
                     'age': [29,43,22,82,41,33,63,57], 
                     'email_linked': [True,True,False,True,False,False,True,True],
                     'occupation': ['teacher','highschool teacher','student','retired',
                                    'tutor','unemployed','entrepreneur','professor']})

Для больших DataFrames мы можем использовать.head(n) для просмотра первых n строк. Чтобы увидеть последние несколько строк, мы можем выполнить аналогичную операцию, используя .tail(n).. Ни то, ни другое не требуется для нашего небольшого набора данных, но мы все же можем продемонстрировать, используя data.head(3).

Фильтрация и индексирование DataFrame

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

# use double brackets to index multiple columns, single brackets for one column
email_data = data[['customer_id', 'email_linked']]

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

# the condition goes inside the square brackets email_data = email_data[email_data['email_linked']]

Применение функции по столбцам

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

def is_educator(occupation):
    return 'teacher' in occupation.lower() or occupation.lower() in ['tutor', 'professor', 'lecturer']

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

data['is_educator'] = data['occupation'].apply(is_educator)

Мы также можем преобразовать все строки в каждом столбце DataFrame. Для этого необходимо установить axis=0 (что также является настройкой по умолчанию). Мы можем написать функцию по столбцам для удаления любых столбцов, содержащих пропущенные значения. Это только для демонстрации - есть более эффективные способы обработки пропущенных значений (см. Официальную документацию Pandas).

def remove_missing_columns(col):
    if col.isnull().values.any():
        return col

data.apply(remove_missing_columns, axis=0)

Применение построчной функции

Мы также можем применить функцию для преобразования каждого столбца в строке. Для этого необходимо установить axis=1.

def is_educator_above_50(row):
    return row['age'] > 50 and is_educator(row['occupation'])

data['is_educator_above_50'] = data.apply(is_educator_above_50, axis=1)

Групповая операция

Операции Groupby полезны для анализа объектов Pandas и разработки новых функций на основе больших объемов данных. Все операции groupby можно разбить на следующие этапы:

  • Разбейте объект на группы.
  • Применить функцию к каждой группе
  • Объедините результаты

Обычно объект разделяется на основе некоторых критериев, сводная статистика вычисляется для каждой группы и объединяется в более крупный объект. Мы можем использовать операцию groupby для вычисления среднего возраста для каждой профессии.

  • Разделить DataFrame по профессии
  • Примените функцию mean к каждому занятию
  • Объедините средний возраст в отдельный объект

Код для этой операции очень простой: data.groupby(by=['occupation']).mean()['age']

Параметр by указывает, как определяются группы, mean () - это интересующая статистика, а индексирование по возрасту берет статистику группы по возрасту. Результатом будет серия, в которой занятие - метки оси.

Мы можем разделить группы, используя несколько параметров, например, комбинацию занятий и наличие ссылки на их адрес электронной почты: data.groupby(by=['email_linked', 'occupation']).mean()['age']

Помимо mean, есть другие встроенные функции, которые мы можем применить к каждой группе: min, max, count, sum и это лишь некоторые из них. Мы также можем использовать agg() для применения любых пользовательских функций. Метод агрегирования также полезен для возврата нескольких сводных статистических данных.

Например, data.groupby(by=['occupation']).agg(['mean', 'sum'])['age'] вернет средний возраст, а также сумму возрастов для каждой группы.

Атрибуты DataFrame

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

  • data.columns возвращает список всех столбцов
  • data.shape возвращает размеры в виде (количество строк, количество столбцов)
  • data.dtypes возвращает типы данных каждого столбца
  • data.index возвращает диапазон значений индекса

Вот некоторые дополнительные материалы, которые могут быть полезны:

Спасибо за чтение!

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