# Pandas: Итерация по строкам DataFrame в Pandas

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

Руководство начнется с объяснения, почему итерация по строкам DataFrame в Pandas часто не нужна и медленнее, чем альтернативы, такие как векторизация. Тем не менее бывают случаи, когда вам _необходимо_ итерировать строки DataFrame. Поэтому мы рассмотрим четыре разных метода, с помощью которых вы можете это сделать. Вы узнаете, как использовать методы Pandas `.iterrows()`, `.itertuples()` и `.items()`. Вы также научитесь использовать циклы Python для перебора каждой строки в DataFrame Pandas.

Быстрый ответ: используйте Pandas `.iterrows()`

```python
# Использование .iterrows() для итерации по строкам Pandas
df = pd.DataFrame.from_dict({
    'Year': [2018, 2019, 2020, 2021],
    'Sales': [1000, 2300, 1900, 3400]})

for idx, row in df.iterrows():
    print(idx, row['Year'], row['Sales'])

# Возвращает:
# 0 2018 1000
# 1 2019 2300
# 2 2020 1900
# 3 2021 3400
```

Оглавление

* [Почему итерация по строкам Pandas Dataframe — плохая идея](#pochemu-iteraciya-po-strokam-pandas-dataframe-plokhaya-ideya)
* [Загрузка образца Pandas Dataframe](#zagruzka-obrazca-pandas-dataframe)
* [Как векторизовать вместо итерации по строкам](#kak-vektorizovat-vmesto-iteracii-po-strokam)
* [Как использовать iterrows Pandas для итерации по строкам Dataframe](#kak-ispolzovat-iterrows-pandas-dlya-iteracii-po-strokam-dataframe)
* [Как использовать itertuples Pandas для итерации по строкам Dataframe](#kak-ispolzovat-itertuples-pandas-dlya-iteracii-po-strokam-dataframe)
* [Как использовать элементы Pandas для итерации по строкам Dataframe](#kak-ispolzovat-elementy-pandas-dlya-iteracii-po-strokam-dataframe)
* [Как использовать цикл For для итерации по строкам Pandas Dataframe](#kak-ispolzovat-cikl-for-dlya-iteracii-po-strokam-pandas-dataframe)
* [Заключение](#zaklyuchenie)

### Почему итерация по строкам Pandas Dataframe — плохая идея

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

Хотя итерация по строкам может показаться логичным инструментом для тех, кто привык работать с такими инструментами, как Excel, многие процессы можно реализовать гораздо лучше. Итерация по строкам, если это не необходимо, является плохой привычкой.

В порядке предпочтения, мой рекомендуемый подход заключается в следующем:

1. Векторизовать, если возможно
2. Используйте метод `.apply()`, если вам нужно применить функцию, требующую информацию на уровне строки.

Перечисленные выше альтернативы гораздо более идиоматичны и легче для восприятия. Хотя использование метода `.apply()` медленнее, чем векторизация, оно часто бывает проще для понимания начинающими.

### Загрузка образца Pandas Dataframe

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

Давайте начнем с загрузки данных и их вывода.

```python
import pandas as pd

df = pd.DataFrame.from_dict(
    {
        'Year': [2018, 2019, 2020, 2021],
        'Sales': [1000, 2300, 1900, 3400],
    }
)

print(df)

# Возвращает:
#    Year  Sales
# 0  2018   1000
# 1  2019   2300
# 2  2020   1900
# 3  2021   3400
```

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

### Как векторизовать вместо итерации по строкам

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

В примере ниже вы узнаете, как возвести число в квадрат в столбце. Если бы вы перебирали каждую строку, вы бы выполнили вычисление столько раз, сколько записей в столбце. Однако при векторизации вы можете применить преобразование непосредственно к столбцу.

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

```python
df['Sales Squared'] = df['Sales'] ** 2

print(df)

# Возвращает:
#    Year  Sales  Sales Squared
# 0  2018   1000        1000000
# 1  2019   2300        5290000
# 2  2020   1900        3610000
# 3  2021   3400       11560000
```

Теперь, когда вы знаете, как применять векторизацию к данным, давайте изучим метод `.iterrows()` в Pandas для итерации по строкам.

### Как использовать iterrows Pandas для итерации по строкам Dataframe

Чтобы перебрать строки датафрейма Pandas, мы можем использовать метод `.iterrows()`. Этот метод [создает объект генератора на основе кортежей](https://datagy.io/python-generators-yield/). Это означает, что каждое кортеж содержит индекс (из датафрейма) и значения строки. Важное замечание: **`.iterrows()` не сохраняет типы данных**. Если вы хотите сохранить типы данных, обратите внимание на следующую секцию о `.itertuples()`.

Давайте посмотрим, как работает метод `.iterrows()` .

```python
# Использование .iterrows() для итерации по строкам Pandas

for idx, row in df.iterrows():
    print(idx, row['Year'], row['Sales'])

# Возвращает:
# 0 2018 1000
# 1 2019 2300
# 2 2020 1900
# 3 2021 3400
```

Как видно, приведённый выше метод генерирует кортеж, который мы можем распаковать. Первый элемент содержит индекс строки, а второй — серию Pandas, содержащую данные строки.

Метод `.iterrows()` работает медленно, так как он должен создавать серию Pandas для каждой строки.

В следующем разделе вы узнаете, как использовать метод `.itertuples()` для перебора строк в DataFrame Pandas.

### Как использовать itertuples Pandas для итерации по строкам Dataframe

Метод `.itertuples()` - интересный метод, который, как и метод `.iterrows()`, возвращает объект-генератор каждой строки в dataframe Pandas.

В отличие от предыдущего метода, метод `.itertuples()` возвращает `именованный кортеж` для каждой строки в датафрейме. Именованный кортеж похож на обычный кортеж, но каждый элемент имеет имя атрибута.

Давайте посмотрим, как это выглядит, распечатав каждый именованный кортеж, возвращаемый методом `.itertuples()`:

```python
# Использование .itertuples() для итерации по строкам dataframe

for row in df.itertuples():
    print(row)

# Возвращает:
# Pandas(Index=0, Year=2018, Sales=1000)
# Pandas(Index=1, Year=2019, Sales=2300)
# Pandas(Index=2, Year=2020, Sales=1900)
# Pandas(Index=3, Year=2021, Sales=3400)
```

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

Давайте посмотрим, как можно вывести атрибут `Year` каждой строки в Python:

```python
# Использование .itertuples() для итерации по строкам dataframe

for row in df.itertuples():
    print(row.Year)

# Возвращает:
# 2018
# 2019
# 2020
# 2021
```

В следующем разделе вы научитесь использовать метод `.items()` для перебора элементов в датафрейме в Pandas.

### Как использовать элементы Pandas для итерации по строкам Dataframe

Метод Pandas `.items()` позволяет получить доступ к каждому элементу строки в Pandas. Он генерирует объекты-генераторы для каждого столбца и их элементов

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

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

```python
# Использование .items() для итерации по столбцам dataframe

for column_name, data in df.items():
    print(column_name, data)

# Возвращает:
# Year 0    2018
# 1    2019
# 2    2020
# 3    2021
# Name: Year, dtype: int64
# Sales 0    1000
# 1    2300
# 2    1900
# 3    3400
# Name: Sales, dtype: int64
```

В следующем разделе вы узнаете, как использовать цикл for в Python для перебора строк в датафрейме Pandas.

### Как использовать цикл For для итерации по строкам Pandas Dataframe

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

Мы можем использовать аксессор Pandas `.iloc` для доступа к различным строкам при выполнении цикла for.

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

```python
for i in range(len(df)):
    print(df.iloc[i, :])

# Возвращает:
# Year     2018
# Sales    1000
# Name: 0, dtype: int64
# Year     2019
# Sales    2300
# Name: 1, dtype: int64
# Year     2020
# Sales    1900
# Name: 2, dtype: int64
# Year     2021
# Sales    3400
# Name: 3, dtype: int64
```

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

В этом учебном руководстве вы узнали о переборе строк в датафрейме Pandas. Вы начали с изучения причин, почему обход датафрейма построчно — плохая идея, и почему векторизация является гораздо лучшей альтернативой для большинства задач. Вы также узнали, как перебирать строки датафрейма Pandas, используя три различных метода датафрейма, а также цикл for с использованием индекса датафрейма.

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