DevGang
Авторизоваться

Изменение формы данных с помощью Python: широкие и длинные 

Существует два фундаментальных подхода к хранению данных: широкие и длинные данные. Узнайте, что это значит и как работать с этими данными.

В этой статье мы рассмотрим:

  • что такое широкие и длинные данные
  • почему существует необходимость в двух разных форматах данных
  • как преобразовать данные из одного типа в другой

Что такое широкие и длинные данные?

Эту концепцию проще объяснить на примере. На изображении вы можете видеть две таблицы, которые представляют одну и ту же информацию - только в двух разных форматах

Пример широких и длинных данных
Пример широких и длинных данных
  • В обеих таблицах указаны школьные оценки трех учеников (Стюарта, Боба и Кевина).
  • В обоих типах у вас есть столбец с именем Student. Это также называется столбцом идентификатора, потому что он содержит значения, которые не повторяются.
  • В широком формате другие столбцы представляют различные классы (Math, Sport, and Art).
  • В длинном формате есть только два дополнительных столбца: один содержит ключи (здесь: subjects), другой содержит значения (здесь: the grades).

Вы можете сразу понять, почему длинный формат имеет свое название — в нем значительно больше строк, чем в широком формате. Кроме того, идентификаторы (здесь: students) повторяются, в то время как идентификаторы в широком формате отображаются только один раз.

Почему существует необходимость в двух разных форматах?

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

Однако у такого представления данных есть свои недостатки. Самое главное, что данными легче манипулировать в длинном формате.

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

Преобразование данных из широких в длинные (и наоборот)

Этот шаг также называется изменением формы данных. Давайте сначала создадим некоторые данные в широком формате.

#%% packages
import pandas as pd

# %%
data = {  #1
    'student': ['Stuart', 'Bob', 'Kevin'],
    'math': [2,3,3],
    'sport': [3,1,2],
    'art': [4,2,1]
    
}
df_wide = pd.DataFrame(data=data)  #2
df_wide

Сначала мы создаем данные в виде словаря (#1). Затем мы создаем базу фреймов данных на основе словаря (#2). В результате мы имеем наш фрейм данных в широком формате.

Данные в широком формате
Данные в широком формате

Преобразование широкого формата в длинный

Для преобразования используется функция melt(). Он преобразует данные из широкого формата в длинный. Этот шаг также называется откреплением. 


df_long = df_wide.melt(id_vars= ['student'], 
             var_name = 'subject',
             value_name = 'grade')
df_long

Мы определяем три параметра:

  • id_vars принимает все столбцы которые следует игнорировать в процессе преобразования. эти столбцы идентифицируют наблюдение
  • var_name получает новое имя, представляющее преобразуемые столбцы
  • value_name представляет имя нового столбца, в котором хранятся значения

Результат выглядит следующим образом

Данные в длинном формате
Данные в длинном формате

Вы успешно преобразовали данные из широкого формата в длинный.

Теперь давайте сделаем обратный шаг и изменим форму с длинной на широкую. 

Преобразование длинного формата в широкий

Мы используем функцию pivot() и сохраняет результат в объекте с именем df_wide2.

df_wide2 = df_long.pivot(index='student', columns='subject', values='grade')
df_wide2

Для работы функции требуется следующие параметры:

  • index: имя столбца идентификатора
  • columns: имена столбцов, из которых будут извлечены новые имена столбцов
  • values: имя столбца, которое используется для заполнения значений в новых столбцах
Данные в широком формате
Данные в широком формате

Есть разница с нашими исходными данными в широком формате. Эта версия имеет индекс, основанный на именах учащихся.

Индекс фрейма данных после поворота
Индекс фрейма данных после поворота

Можно избежать такого поведения, вызвав reset_index() и впоследствии вызвав rename_axis(None, axis=1)Reset_index() удаляет дополнительный уровень индекса. Rename_axis() затем удаляет дополнительный столбец, который был создан в процессе.

df_wide_wo_index = df_long.pivot(index='student', columns='subject', values='grade', ).reset_index().rename_axis(None, axis=1)

Наконец, мы восстановим данные в широком формате.

Данные в широком формате
Данные в широком формате

Из этой статьи вы узнали, что существует два разных формата данных: длинный  и широкий. Кроме того, теперь вы знаете как преобразовать его из одного формата в другой с помощью Python.

#Python
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу