# Транспонирование Dataframe в Pandas

В этой статье вы узнаете, как транспонировать dataframe Pandas с помощью атрибута `.T` и метода `.transpose()`. Кроме того, вы научитесь создавать копию dataframe (а не представление).

**Оглавление**

* [Загрузка примера dataframe](#zagruzka-primera-dataframe)
*  [Что такое транспонирование?](#chto-takoe-transponirovanie)
* [Транспонирование DataFrame в Panda](#transponirovanie-dataframe-v-pandas)
  * [Транспонирование DataFrame Pandas с разнородными типами данных](#transponirovanie-dataframe-pandas-s-raznorodnymi-tipami-dannykh)
*  [Создание копии при транспонировании для смешанных типов данных](#sozdanie-kopii-pri-transponirovanii-dlya-smeshannykh-tipov-dannykh)
* [Заключение](#zaklyuchenie)

### Загрузка примера dataframe

Для этого урока мы будем использовать два разных набора данных. Это связано с тем, что метод `.transpose()` работает по-разному в зависимости от того, содержит ли ваш dataframe разнородные типы данных или нет.

Давайте начнем с загрузки примеров dataframe:

{% tabs %}
{% tab title="Код" %}
```python
import pandas as pd

df1 = pd.DataFrame.from_dict(
    {
        'Name': ['Jane', 'Melissa', 'John', 'Matt'],
        'Age': [23, 45, 35, 64],
        'Birth City': ['London', 'Paris', 'Toronto', 'Atlanta'],
        'Gender': ['F', 'F', 'M', 'M']
    }
)

df2 = pd.DataFrame.from_dict(
    {
        'Age': [1,2,3,4,5],
        'Size': [10,24,43,54,56]
    }
)

print('Dataframe df1:')
print(df1)
print('Dataframe df2:')
print(df2)
```
{% endtab %}

{% tab title="Результат" %}
```python
Dataframe df1:
      Name  Age Birth City Gender
0     Jane   23     London      F
1  Melissa   45      Paris      F
2     John   35    Toronto      M
3     Matt   64    Atlanta      M


Dataframe df2:
   Age  Size
0    1    10
1    2    24
2    3    43
3    4    54
4    5    56
```
{% endtab %}
{% endtabs %}

### Что такое транспонирование?

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

Транспонированная матрица, например `df`, обычно обозначается как `df^T`.

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

Например, предположим, у вас есть матрица из 3 строк и 2 столбцов. Транспонированная матрица будет иметь 2 строки и 3 столбца.

Узнать больше о транспонировании можно в этой статье на Википедии.

### Транспонирование DataFrame в Pandas

Pandas предоставляет два простых способа транспонировать dataframe. Это можно сделать, добавив `.T` к имени dataframe, или с помощью метода `.transpose()`, который позволяет задать дополнительные параметры для более гибкого управления.

Давайте транспонируем dataframe `df2` и немного исследуем его транспонированную версию, прежде чем перейти к более сложному примеру.

Используем метод `.T` для транспонирования нашего dataframe:

```python
>>> df2_T = df2.T
>>> print(df2_T)

       0   1   2   3   4
Age    1   2   3   4   5
Size  10  24  43  54  56
```

Теперь важно отметить, что все наши значения имеют одинаковый тип данных (конкретно — целые числа). Давайте также изучим типы данных исходного dataframe и его транспонированной версии:

{% tabs %}
{% tab title="Код" %}
```python
df2_T = df2.T
print('df2\'s datatypes:')
print(df2.dtypes)
print('\n')
print('df2_T\'s datatypes:')
print(df2_T.dtypes)
```
{% endtab %}

{% tab title="Результат" %}
```python
df2's datatypes:
Age     int64
Size    int64
dtype: object


df2_T's datatypes:
0    int64
1    int64
2    int64
3    int64
4    int64
dtype: object
```
{% endtab %}
{% endtabs %}

Ознакомьтесь с другими уроками Python на сайте datagy, включая наше полное руководство по стилизации Pandas и подробный обзор сводных таблиц (Pivot Tables) в Pandas!

#### Транспонирование DataFrame Pandas с разнородными типами данных

Мы можем видеть, что в исходном dataframe и в его транспонированной версии все типы данных представляют собой `int64`.

Теперь давайте рассмотрим, что происходит при наличии смешанных типов данных, как в случае с `df_1`.

{% tabs %}
{% tab title="Код" %}
```python
df1_T = df1.transpose()
print(df1_T)
```
{% endtab %}

{% tab title="Результат" %}
```
                 0        1        2        3
Name          Jane  Melissa     John     Matt
Age             23       45       35       64
Birth City  London    Paris  Toronto  Atlanta
Gender           F        F        M        M
```
{% endtab %}
{% endtabs %}

Если теперь посмотреть на типы данных этих двух фреймов данных, то можно увидеть, что возвращаются следующие элементы:

{% tabs %}
{% tab title="Код" %}
```python
df1_T = df1.T
print('df1\'s datatypes:')
print(df1.dtypes)
print('\n')
print('df1_T\'s datatypes:')
print(df1_T.dtypes)
```
{% endtab %}

{% tab title="Результат" %}
```python
df1's datatypes:
Name          object
Age            int64
Birth City    object
Gender        object
dtype: object


df1_T's datatypes:
0    object
1    object
2    object
3    object
dtype: object
```
{% endtab %}
{% endtabs %}

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

### Создание копии при транспонировании для смешанных типов данных

По умолчанию, Pandas создаст копию dataframe, если обнаружит смешанные типы данных. Это поведение реализуется неявно, и Pandas автоматически обрабатывает такие случаи.

Однако, если все данные в вашем dataframe имеют один и тот же тип, как в примере `df2`, вы можете явно указать Pandas создать копию, установив параметр `copy=True`.

### Заключение

В этой статье вы узнали, как транспонировать DataFrame в Pandas. Вы научились использовать как атрибут `.T`, так и метод `.transpose()`. Также вы познакомились с тем, что такое транспонирование и как различные типы данных могут влиять на результат.

Чтобы узнать больше о функции транспонирования в Pandas, ознакомьтесь с официальной документацией по [этой ссылке](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.transpose.html).
