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

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

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

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

# Использование .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 — плохая идея

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

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

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

  1. Векторизовать, если возможно

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

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

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

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

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

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

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

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

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

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

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

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(). Этот метод создает объект генератора на основе кортежей. Это означает, что каждое кортеж содержит индекс (из датафрейма) и значения строки. Важное замечание: .iterrows() не сохраняет типы данных. Если вы хотите сохранить типы данных, обратите внимание на следующую секцию о .itertuples().

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

# Использование .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():

# Использование .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:

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

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

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

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

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

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

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

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

# Использование .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

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(), ознакомьтесь с официальной документацией здесь.

Last updated