# Python: Разделение DataFrame Pandas

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

Умение разделять DataFrame Pandas является полезным навыком во многих приложениях: в машинном обучении для выбора случайных значений, при разделении данных на определённые группы для автоматизации отчётов и т. д.

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

* [Загрузка примера dataframe](#zagruzka-primera-dataframe)
*  [Разделение DataFrame Pandas по значению столбца](#razdelenie-dataframe-pandas-po-znacheniyu-stolbca)
*  [Получение всех групп DataFrame по значению](#poluchenie-vsekh-grupp-dataframe-po-znacheniyu)
*  [Разделение DataFrame Pandas по позиции](#razdelenie-dataframe-pandas-po-pozicii)
*  [Разделение DataFrame Pandas на случайные строки](#razdelenie-dataframe-pandas-na-sluchainye-stroki)
*  [Заключение](#zaklyuchenie)

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

Если вы хотите следовать материалу урока, загрузите приведённый ниже образец DataFrame. Если у вас есть собственные данные, вы можете использовать их, хотя некоторые примеры могут потребовать дополнительной адаптации под ваш контекст.

Давайте начнём и загрузим данные!

{% tabs %}
{% tab title="Код" %}
```python
import pandas as pd
df = pd.DataFrame.from_dict(
    {
        'Name': ['Jenny', 'Matt', 'Kristen', 'Jenny', 'Matt', 'Kristen', 'Jenny', 'Matt', 'Kristen', 'Jenny', 'Matt', 'Kristen'],
        'Year': [2020, 2021, 2022, 2020, 2021, 2022, 2020, 2021, 2022, 2020, 2021, 2022],
        'Income': [10000, 11000, 9000, 12000, 13000, 11000, 14000, 15000, 13000, 12000, 14000, 13000],
        'Gender': ['F', 'M', 'F', 'F', 'M', 'F', 'F', 'M', 'F', 'F', 'M', 'F']
    }
)
print(df)
```
{% endtab %}

{% tab title="Результат" %}
```python
       Name  Year  Income Gender
0     Jenny  2020   10000      F
1      Matt  2021   11000      M
2   Kristen  2022    9000      F
3     Jenny  2020   12000      F
4      Matt  2021   13000      M
5   Kristen  2022   11000      F
6     Jenny  2020   14000      F
7      Matt  2021   15000      M
8   Kristen  2022   13000      F
9     Jenny  2020   12000      F
10     Matt  2021   14000      M
```
{% endtab %}
{% endtabs %}

Мы можем видеть, что у нас есть четыре столбца: Name (Имя), Year (Год), Income (Доход) и Gender (Пол). У нас есть данные о доходах трёх человек за три года, а также их пол. Давайте посмотрим, как мы можем разделить этот DataFrame!

### Разделение DataFrame Pandas по значению столбца

Разделение DataFrame по значению столбца — это очень полезный навык. Он может пригодиться при автоматизации отчётов или при работе с различными категориями данных внутри DataFrame.

Вы научитесь разделять DataFrame по значениям столбцов с помощью метода `.groupby()`.&#x20;

Давайте посмотрим, как можно разделить DataFrame по столбцу `Name` (Имя):

```python
grouped = df.groupby(df['Name'])
print(grouped.get_group('Jenny'))
```

Что мы сделали здесь:

1. Создали объект группировки `grouped`, разделив DataFrame по столбцу `Name` (Имя),
2. Использовали метод `.get_group()`, чтобы получить строки DataFrame, содержащие значение `'Jenny'`.

### Получение всех групп DataFrame по значению

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

Теперь вы узнаете, как разделить DataFrame на все возможные группы.

Начнём с того, что получим все уникальные значения в столбце. Для этого воспользуемся методом Pandas `.unique()`, о котором вы можете подробнее узнать в моей статье по этой ссылке. Если вы предпочитаете видеоформат, посмотрите мой ролик ниже:

В следующем примере мы пройдемся циклом по DataFrame и сохраним каждую группу в отдельный файл Excel:

```python
grouped = df.groupby(df['Name'])

path_to_directory = '/Users/datagy/'
for name in df['Name'].unique():
    temporary_df = grouped.get_group(name)
    temporary_df.to_excel(f'{path_to_directory}name.xlsx')
```

Что мы сделали здесь — это пройтись циклом по уникальным значениям столбца `Name` в DataFrame, получить соответствующую группу для каждого имени и сохранить её в отдельный файл Excel.

### Разделение DataFrame Pandas по позиции

В этом разделе вы узнаете, как разделить DataFrame Pandas по определённой позиции внутри данных. Например, как разделить DataFrame пополам или на трети.

Это можно сделать очень легко с помощью акцессора `.iloc` из библиотеки Pandas. Этот мощный инструмент позволяет удобно обращаться к данным по их позиции.&#x20;

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

Предположим, что мы хотим разделить DataFrame пополам — то есть разрезать данные по строкам в середине.

Чтобы найти середину DataFrame, нужно определить его длину и разделить на два. После этого мы можем использовать акцессор `.iloc` для разделения данных:

```python
>>> half_df = len(df) // 2
>>> first_half = df.iloc[:half_df,]

>>> print(first_half)

      Name  Year  Income Gender
0    Jenny  2020   10000      F
1     Matt  2021   11000      M
2  Kristen  2022    9000      F
3    Jenny  2020   12000      F
4     Matt  2021   13000      M
5  Kristen  2022   11000      F
```

Мы можем видеть, что DataFrame вернул первую половину значений.\
Теперь давайте посмотрим, как превратить это в функцию, которая разделит DataFrame на несколько частей:

{% tabs %}
{% tab title="Код" %}
```python
def split_dataframe_by_position(df, splits):
    """
    Разбивает dataframe на указанное количество частей по позиции.

    Аргументы:
        df: Pandas DataFrame, который нужно разбить.
        splits: Целое число, количество частей, на которые нужно разбить DataFrame.

    Возвращает:
        Список Pandas DataFrames.
    """
    dataframes = []
    index_to_split = len(df) // splits
    start = 0
    end = index_to_split
    for split in range(splits):
        temporary_df = df.iloc[start:end, :]
        dataframes.append(temporary_df)
        start += index_to_split
        end += index_to_split
    return dataframes

# Пример использования (предполагается, что DataFrame 'df' уже определен)
# split_dataframes = split_dataframe_by_position(df, 3)
# print(split_dataframes[1])
```
{% endtab %}

{% tab title="Результат" %}
```python
      Name  Year  Income Gender
4     Matt  2021   13000      M
5  Kristen  2022   11000      F
6    Jenny  2020   14000      F
7     Matt  2021   15000      M
```
{% endtab %}
{% endtabs %}

Давайте разберём, что делает эта функция:

1. Создаётся список `dataframes`, в который будут добавляться результирующие части DataFrame.
2. Определяется количество строк, которое должна содержать каждая часть, и это значение присваивается переменной `index_to_split`.
3. Задаются начальные значения: `start = 0` и `end = index_to_split`.
4. Далее происходит цикл по количеству частей, на которые мы хотим разделить DataFrame. На каждом шаге выбираются данные от `start` до `end`.
5. Полученная часть DataFrame добавляется в список `dataframes`, после чего значения `start` и `end` увеличиваются для следующей итерации.
6. В конце функция возвращает список разделённых DataFrame, к которым можно получить доступ по индексу.

Поскольку списки в Python индексируются с нуля, первую часть можно получить как `dataframes[0]`.

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

### Разделение DataFrame Pandas на случайные строки

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

Давайте посмотрим, как разделить DataFrame пополам с помощью метода `.sample()` в Pandas:

```python
>>> half_df = df.sample(frac=0.5)
>>> print(half_df)

      Name  Year  Income Gender
9    Jenny  2020   12000      F
0    Jenny  2020   10000      F
7     Matt  2021   15000      M
1     Matt  2021   11000      M
6    Jenny  2020   14000      F
2  Kristen  2022    9000      F
```

Мы можем видеть, что DataFrame вернул случайный набор строк.

Теперь давайте посмотрим, как выбрать определённое количество строк с помощью метода `.sample()` в Pandas:

```python
>>> df_3 = df.sample(n=3)
>>> print(df_3)

       Name  Year  Income Gender
9     Jenny  2020   12000      F
11  Kristen  2022   13000      F
0     Jenny  2020   10000      F
```

Здесь мы использовали параметр `n=` для указания количества возвращаемых строк.

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

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

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