Распакуйте Ваши Данные с Помощью Функции Melt в Pandas

В этом руководстве вы научитесь использовать функцию melt библиотеки Pandas для преобразования данных из широкого формата в длинный. Если вы работаете с данными в Python, преобразование и изменение формы ваших данных является необходимым навыком, и именно здесь в игру вступает функция melt() из Pandas. Очистка ваших данных и их трансформация являются важным навыком в науке о данных и инженерии данных.

Это руководство предоставляет ясное и увлекательное введение в эту мощную функцию, насыщенное примерами, которые охватывают всё от основ до продвинутого использования.

К концу этого руководства вы научитесь следующему:

  • Что такое функция Pandas melt() и ее цель в изменении данных

  • Как настроить и использовать функцию плавления pandas с пошаговым описанием ее синтаксиса и параметров.

  • Различие между переменными-идентификаторами, переменными-значениями и измеряемыми переменными, а также как выбрать правильную комбинацию для ваших нужд.

  • Как настроить имена столбцов в объединенном DataFrame, используя id_vars и value_vars

  • Передовые методы плавления, такие как работа с MultiIndex DataFrames и интеграция плавления с другими операциями pandas.

Оглавление

Понимание функции Pandas Melt()

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

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

Давайте погрузимся в изучение синтаксиса функции Pandas melt.

# Understanding the Pandas melt() Function
import pandas as pd

pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name="value", col_level=None, ignore_index=True,)

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

Параметр
Аргумент по умолчанию
Описание
Принятые значения

frame

Входной DataFrame, который нужно расплавить

A Pandas DataFrame

id_vars

None

Переменные идентификатора, которые останутся неизменными в результирующем DataFrame.

Scalar/list of Scalars/column index (integer)

value_vars

None

Переменные для преобразования в длинный формат

Scalar/list of Scalars/column index (integer)

var_name

None

Пользовательское имя для результирующего столбца «переменная».

A string representing the new column name

value_name

“value”

Пользовательское имя для результирующего столбца «значение».

A string representing the new column name

col_level

None

Для MultiIndex DataFrames — уровень объединяемого столбца.

An integer/string/column index

ignore_index

True

Добавляет новый индекс вместо сохранения предыдущей структуры индекса.

Boolean: True/False

По умолчанию, когда параметры id_vars, value_vars и col_level не указаны, Pandas предполагает, что все столбцы, не являющиеся идентификаторами, являются value_vars, и проводит преобразование всего DataFrame.

Давайте теперь погрузимся в то, как мы можем использовать функцию melt() в Pandas, рассматривая различные примеры.

Загрузка образца DataFrame Pandas

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

Давайте рассмотрим как загрузить его и напечатать первые несколько записей. Набор данных содержит информацию о различных покупках типов одежды.

# Loading a Sample Pandas DataFrame
import pandas as pd
df = pd.DataFrame({'Date': ['2020-07-11','2020-09-23','2020-04-02','2020-02-28','2020-03-19'],
 'Region': ['East', 'North', 'South', 'East', 'West'],
 'Type': ['Children', 'Children', 'Women', 'Children', 'Women'],
 'Units': [18.0, 14.0, 17.0, 26.0, 3.0],
 'Sales': [306.0, 448.0, 425.0, 832.0, 33.0]})

print(df)

# Returns:
#          Date Region      Type  Units  Sales
# 0  2020-07-11   East  Children   18.0  306.0
# 1  2020-09-23  North  Children   14.0  448.0
# 2  2020-04-02  South     Women   17.0  425.0
# 3  2020-02-28   East  Children   26.0  832.0
# 4  2020-03-19   West     Women    3.0   33.0

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

Использование функции Pandas Melt() для разворота DataFrame

В этом разделе мы сосредоточимся на использовании параметра id_vars функции melt библиотеки pandas для преобразования DataFrame из широкого формата в длинный.

При преобразовании DataFrame в "плавленый" формат, id_vars относится к идентификаторам переменных, то есть к столбцам в вашем DataFrame, которые вы хотите оставить без изменений, в то время как остальные столбцы перестраиваются из широкого формата в длинный. Эти переменные-идентификаторы предоставляют контекст для полученного "плавленого" DataFrame.

Давайте посмотрим, как мы можем использовать Pandas для "расплавления" DataFrame:

# Melting a DataFrame with id_vars
melted = pd.melt(
    frame=df, 
    id_vars='Region'
)
print(melted)

# Returns:
#    Region variable       value
# 0    East     Date  2020-07-11
# 1   North     Date  2020-09-23
# 2   South     Date  2020-04-02
# 3    East     Date  2020-02-28
# 4    West     Date  2020-03-19
# ...
# 15   East    Sales       306.0
# 16  North    Sales       448.0
# 17  South    Sales       425.0
# 18   East    Sales       832.0
# 19   West    Sales        33.0

В указанном выше блоке кода мы уточнили, что хотим использовать id_vars='Region'. Указывая id_vars='Region', мы сообщаем pandas оставить столбец ‘Region’ без изменений, в то время как остальные столбцы в DataFrame будут "расплавлены".

Аналогично, параметр id_vars= принимает несколько меток столбцов. Давайте исследуем это в следующем разделе.

Использование нескольких переменных-идентификаторов в Pandas Melt()

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

Давайте посмотрим, как мы можем "расплавить" DataFrame, сохраняя столбцы Region и Type без изменений, передав список меток:

# Adding a Second id_vars
melted = pd.melt(
    frame=df,
    id_vars=['Region', 'Type']
)
print(melted)

# Returns:
#    Region      Type variable       value
# 0    East  Children     Date  2020-07-11
# 1   North  Children     Date  2020-09-23
# 2   South     Women     Date  2020-04-02
# 3    East  Children     Date  2020-02-28
# 4    West     Women     Date  2020-03-19
# 5    East  Children    Units        18.0
# 6   North  Children    Units        14.0
# 7   South     Women    Units        17.0
# 8    East  Children    Units        26.0
# 9    West     Women    Units         3.0
# 10   East  Children    Sales       306.0
# 11  North  Children    Sales       448.0
# 12  South     Women    Sales       425.0
# 13   East  Children    Sales       832.0
# 14   West     Women    Sales        33.0

В полученном выше DataFrame мы видим, что столбцы Region и Type остались без изменений, но другие столбцы были трансформированы из широкого формата в длинный.

Использование переменных значений в функции Pandas Melt()

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

Давайте посмотрим, как мы можем распаковать только столбец с продажами, разбитый по регионам:

# Melting a DataFrame with value_vars
melted = pd.melt(
    frame=df, 
    id_vars='Region', 
    value_vars='Sales'
)
print(melted)

# Returns:
#   Region variable  value
# 0   East    Sales  306.0
# 1  North    Sales  448.0
# 2  South    Sales  425.0
# 3   East    Sales  832.0
# 4   West    Sales   33.0

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

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

Использование переменных с несколькими значениями в Pandas Melt()

Передавая несколько меток столбцов в параметр value_vars= функции melt() Pandas, вы можете выполнить обратное преобразование нескольких колонок. Это вернет пары ключ-значение для двух столбцов, разделенные по столбцам, указанным в id_vars=

Давайте посмотрим, как это выглядит:

# Adding a Second Value Var
melted = pd.melt(
    frame=df, 
    id_vars='Region', 
    value_vars=['Sales', 'Units']
)
print(melted)

# Returns:
#   Region variable  value
# 0   East    Sales  306.0
# 1  North    Sales  448.0
# 2  South    Sales  425.0
# 3   East    Sales  832.0
# 4   West    Sales   33.0
# 5   East    Units   18.0
# 6  North    Units   14.0
# 7  South    Units   17.0
# 8   East    Units   26.0
# 9   West    Units    3.0

Мы видим, что столбец Регион остался неизменным. Были добавлены два столбца (переменная и значение), представляющие пары ключ-значение для столбцов Продажи и Единицы.

В следующем разделе вы узнаете, как настроить имена переменных значений и идентификаторов, используя функцию melt() в Pandas.

Настройка имен переменных значений и идентификаторов в Pandas Melt()

При использовании функции "расплавления" (melt) в Pandas, по умолчанию, названия столбцов устанавливаются как variable и value. Чтобы изменить это поведение, можно воспользоваться параметрами var_name= и value_name=.

Оба эти параметра принимают одну строку в качестве входных данных. Давайте посмотрим, как мы можем настроить их, передавая в качестве аргументов Категорию и Сумму.

# Naming id_vars and value_vars
melted = pd.melt(
    frame=df, 
    id_vars='Region', 
    value_vars='Sales', 
    var_name='Category', 
    value_name='Amount'
)
print(melted)

# Returns:
#   Region Category  Amount
# 0   East    Sales   306.0
# 1  North    Sales   448.0
# 2  South    Sales   425.0
# 3   East    Sales   832.0
# 4   West    Sales    33.0

В получившемся выше DataFrame, мы добавили var_name='Категория' и value_name='Сумма'. Это привело к тому, что мы передали более чистые, понятные имена нашим колонкам.

Сохранение исходного индекса DataFrame в Pandas Melt()

По умолчанию Pandas перезаписывает предыдущий индекс. Можно изменить это поведение, настроив параметр ignore_index=. По умолчанию он установлен в значение True, но если мы изменяем его на False, то будет сохранён оригинальный индекс. Давайте посмотрим, как это выглядит:

# Keeping the Original Index
melted = pd.melt(
    frame=df, 
    id_vars='Region', 
    value_vars=['Sales', 'Units'], 
    ignore_index=False
)
print(melted)

# Returns:
#   Region variable  value
# 0   East    Sales  306.0
# 1  North    Sales  448.0
# 2  South    Sales  425.0
# 3   East    Sales  832.0
# 4   West    Sales   33.0
# 0   East    Units   18.0
# 1  North    Units   14.0
# 2  South    Units   17.0
# 3   East    Units   26.0
# 4   West    Units    3.0

В приведенном выше примере мы изменили параметр ignore_index= на False. Это означает, что был сохранен исходный индекс (что объясняет, почему мы видим повторение индексов от 0 до 4).

Использование col_level в функции плавления Pandas с многоиндексными столбцами

Параметр col_level становится особенно полезным при работе с DataFrame, содержащими MultiIndex по столбцам. Он позволяет определить, какой уровень индекса столбца следует использовать при трансформации DataFrame с помощью функции "melt". Давайте рассмотрим это на простом примере:

# Working with col_level in Pandas melt
import pandas as pd

# Creating a sample DataFrame with MultiIndex columns
columns = pd.MultiIndex.from_tuples(
    [('Sales', '2019'), ('Sales', '2020'), ('Profit', '2019'), ('Profit', '2020')],
    names=['Category', 'Year']
)
data = [
    [200, 250, 100, 120],
    [300, 340, 150, 160],
    [150, 180, 80, 90],
    [250, 310, 120, 140],
]

index = ['North', 'South', 'East', 'West']
df = pd.DataFrame(data, index=index, columns=columns)
print("Original DataFrame:")
print(df)

# Melting a DataFrame with col_level
melted = pd.melt(
    frame=df,
    col_level='Year',
    id_vars=None  # In this case, we are not using id_vars
)

print(melted)

# Returns:
# Melted DataFrame:
#    Year  variable  value
# 0  2019       NaN    200
# 1  2019       NaN    300
# 2  2019       NaN    150
# 3  2019       NaN    250
# 4  2020       NaN    250
# ...

В этом примере у нас есть DataFrame с мультииндексными столбцами, где ‘Category’ (Уровень 0) представляет собой ‘Sales’ (Продажи) и ‘Profit’ (Прибыль), а ‘Year’ (Уровень 1) представляет ‘2019’ и ‘2020’. Когда мы устанавливаем col_level='Year', функция melt в pandas использует уровень ‘Year’ мультииндекса в качестве столбца ‘variable’ в результирующем «расплавленном» DataFrame.

В кратце, параметр col_level позволяет управлять процессом "расплавления" в DataFrames с мультииндексными колонками, предоставляя вам больше контроля над тем, как ваши данные перестраиваются при использовании функции melt в pandas.

Заключение

Поздравляем с достижением конца этого всестороннего руководства по функции Pandas melt! Мы рассмотрели широкий спектр концепций, инструментов и примеров, которые исследовали многие возможности этого мощного инструмента для манипулирования данными. Чтобы подвести итог, вот что мы узнали:

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

  • Как настроить и эффективно использовать функцию плавления Pandas, углубляясь в синтаксис и параметры функции плавления

  • Определение разницы между переменными-идентификаторами, переменными-значениями и измеряемыми переменными, а также то, почему выбор правильной комбинации id_vars и value_vars имеет решающее значение.

  • Настройка имен столбцов в объединенном DataFrame с использованием параметров id_vars, value_vars, var_name и value_name.

  • Передовые методы плавления, такие как работа с MultiIndex DataFrames и интеграция функции плавления с другими операциями Pandas.

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

Узнайте больше о функции melt, ознакомившись с официальной документацией.

Last updated