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

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

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

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

* Что такое функция Pandas `melt()` и ее цель в изменении данных
* Как настроить и использовать функцию плавления pandas с пошаговым описанием ее синтаксиса и параметров.
* Различие между переменными-идентификаторами, переменными-значениями и измеряемыми переменными, а также как выбрать правильную комбинацию для ваших нужд.
* Как настроить имена столбцов в объединенном DataFrame, используя id\_vars и value\_vars
* Передовые методы плавления, такие как работа с MultiIndex DataFrames и интеграция плавления с другими операциями pandas.

Оглавление

* [Понимание функции Pandas Melt()](#ponimanie-funkcii-pandas-melt)
* [Загрузка образца DataFrame Pandas](#zagruzka-obrazca-dataframe-pandas)
* [Использование функции Pandas Melt() для разворота DataFrame](#ispolzovanie-funkcii-pandas-melt-dlya-razvorota-dataframe)
  * [Использование нескольких переменных-идентификаторов в Pandas Melt()](#ispolzovanie-neskolkikh-peremennykh-identifikatorov-v-pandas-melt)
* [Использование переменных значений в функции Pandas Melt()](#ispolzovanie-peremennykh-znachenii-v-funkcii-pandas-melt)
  * [Использование переменных с несколькими значениями в Pandas Melt()](#ispolzovanie-peremennykh-s-neskolkimi-znacheniyami-v-pandas-melt)
* [Настройка имен переменных значений и идентификаторов в Pandas Melt()](#nastroika-imen-peremennykh-znachenii-i-identifikatorov-v-pandas-melt)
* [Сохранение исходного индекса DataFrame в Pandas Melt()](#sokhranenie-iskhodnogo-indeksa-dataframe-v-pandas-melt)
* [Использование col\_level в функции плавления Pandas с многоиндексными столбцами](#ispolzovanie-col_level-v-funkcii-plavleniya-pandas-s-mnogoindeksnymi-stolbcami)
* [Заключение](#zaklyuchenie)

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

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

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

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

```python
# 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, которую мы используем в [руководстве по сводным таблицам Panda](python-svodnye-tablicy-polnoe-rukovodstvo)s. Она была немного упрощена, чтобы упростить понимание функции.

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

```python
# 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:

```python
# 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` без изменений, передав список меток:

```python
# 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=`, что означает, что все столбцы будут преобразованы. Если мы хотим преобразовать (или развернуть) только один столбец, мы можем указать метку столбца в параметре

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

```python
# 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=`

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

```python
# 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=`.

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

```python
# 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`, то будет сохранён оригинальный индекс. Давайте посмотрим, как это выглядит:

```python
# 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". Давайте рассмотрим это на простом примере:

```python
# 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`, ознакомившись с [официальной документацией](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.melt.html).
