Итерация по строкам фрейма данных – довольно распространенная операция. Поэтому существуют различные способы сделать это. В этом случае мы рассмотрим три наиболее используемых метода и сравним их эффективность.
Содержание
Пример набора данных
Для работы мы будем использовать набор синтетических данных о клиентах.
import pandas as pd
users = {'first_name': ['Иван', 'Сергей', 'Василий', 'Елена', 'Мария', 'Ольга'],
'last_name': ['Иванов', 'Петров', 'Сидоров', 'Иванова', 'Петрова', 'Сидорова'],
'age': [27, 41, 29, 29, 21, 33],
'gender': ['Male', 'Female', 'Female', 'Male', 'Male', 'Female']}
df = pd.DataFrame(users)
Code language: JavaScript (javascript)
Итерация элементов с помощью функции for
Стандартным способом итерации в Python является использование for для диапазона.
В случае с DataFrame вы можете выполнять итерации по длине DataFrame, используя iloc для доступа к i-й строке объекта в каждой итерации.
Это можно увидеть на следующем примере.
for i in range(len(df)):
print(df.iloc[i]['first_name'])
Code language: CSS (css)
Иван Сергей Василий Елена Мария Ольга
В этом случае в каждой из итераций выбирается имя клиента и выводится на экран.
Итерация по элементам iterrows
Это свойство во всех DataFrames возвращает итерируемый объект, который можно использовать в цикле for.
Содержимое в каждой итерации представляет собой кортеж с индексом и ряд с содержимым строки.
Таким образом, чтобы воспроизвести результаты приведенного выше примера, вам придется сделать что-то вроде следующего.
for index, row in df.iterrows():
print(row['first_name'])
Code language: CSS (css)
Обратите внимание, что наиболее практично распаковывать кортеж, чтобы индекс был в одной переменной, а ряд – в другой.
Итерация по элементам itertuples
Еще один метод DataFame Pandas, который возвращает итерируемый объект, – itertuples.
Разница между этим и предыдущим способом заключается в том, что результатом является именованный кортеж (namedtuples), где каждый из элементов помечен именем столбцов.
Таким образом, вы можете воспроизвести пример, рассмотренный в предыдущих разделах, с помощью следующего кода.
for row in df.itertuples():
print(row.first_name)
Code language: CSS (css)
Если вам нужно получить индекс строки, по которой вы выполняете итерацию, значение находится в кортеже с именем Index.
Сравнение производительности
При работе с небольшими DataFrames, около тысячи строк, мы можем использовать метод, который нам наиболее удобен, так как разница в вычислениях не будет заметна.
Но когда речь идет о миллионах элементов, это не так.
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(1000000, 2)), columns=list('AB'))
for i in range(len(df)): # 51.4 мс
pass
for index, row in df.iterrows(): # 48 с
pass
for index, row in df.iterrows(): # 544 мс
pass
Code language: PHP (php)
Получены следующие результаты
Итерация | Время (мс) |
for | 51,4 |
iterrows | 48.000 |
iterrows | 544 |
Заключение
На этот раз мы рассмотрели различные методы итерации строк фрейма данных в Pandas.
Эти методы могут быть более подходящими в зависимости от того, что вы хотите делать с данными в каждый конкретный момент времени.
Однако мы также видели, что для DataFrames с сотнями тысяч или миллионами записей самым быстрым методом является итерация по диапазону с помощью for.