Изменение формы данных с помощью 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.