Как перебирать строки в фрейме данных Pandas

Введение Pandas - чрезвычайно популярный фреймворк для обработки данных в Python. Во многих случаях вам может потребоваться перебрать данные - либо для их распечатки, либо для выполнения с ними некоторых операций. В этом руководстве мы рассмотрим, как перебирать строки в Pandas DataFrame. Если вы новичок в Pandas, вы можете прочитать наше руководство для начинающих [/ beginners-tutorial-on-the-pandas-python-library /]. Когда вы освоитесь, давайте рассмотрим три основных способа перебора DataFrame: * items ()

Вступление

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

В этом руководстве мы рассмотрим, как перебирать строки в Pandas DataFrame .

Если вы новичок в Pandas, вы можете прочитать наше руководство для начинающих . Когда вы освоитесь, давайте рассмотрим три основных способа перебора DataFrame:

  • items()
  • iterrows()
  • itertuples()

Итерация DataFrames с помощью items ()

Давайте DataFrame с некоторыми данными вымышленных людей:

 import pandas as pd 
 
 df = pd.DataFrame({ 
 'first_name': ['John', 'Jane', 'Marry', 'Victoria', 'Gabriel', 'Layla'], 
 'last_name': ['Smith', 'Doe', 'Jackson', 'Smith', 'Brown', 'Martinez'], 
 'age': [34, 29, 37, 52, 26, 32]}, 
 index=['id001', 'id002', 'id003', 'id004', 'id005', 'id006']) 

Обратите внимание, что мы используем id в качестве DataFrame нашего DataFrame. Давайте посмотрим, как выглядит DataFrame

 print(df.to_string()) 

 first_name last_name age 
 id001 John Smith 34 
 id002 Jane Doe 29 
 id003 Marry Jackson 37 
 id004 Victoria Smith 52 
 id005 Gabriel Brown 26 
 id006 Layla Martinez 32 

Теперь, чтобы DataFrame этот DataFrame, мы будем использовать функцию items()

 df.items() 

Это возвращает генератор :

 <generator object DataFrame.items at 0x7f3c064c1900> 

Мы можем использовать это для генерации пар col_name и data . Эти пары будут содержать имя столбца и каждую строку данных для этого столбца. Давайте пройдемся по именам столбцов и их данным:

 for col_name, data in df.items(): 
 print("col_name:",col_name, "\ndata:",data) 

Это приводит к:

 col_name: first_name 
 data: 
 id001 John 
 id002 Jane 
 id003 Marry 
 id004 Victoria 
 id005 Gabriel 
 id006 Layla 
 Name: first_name, dtype: object 
 col_name: last_name 
 data: 
 id001 Smith 
 id002 Doe 
 id003 Jackson 
 id004 Smith 
 id005 Brown 
 id006 Martinez 
 Name: last_name, dtype: object 
 col_name: age 
 data: 
 id001 34 
 id002 29 
 id003 37 
 id004 52 
 id005 26 
 id006 32 
 Name: age, dtype: int64 

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

Мы также можем напечатать конкретную строку, передав номер индекса в data как мы это делаем со списками Python:

 for col_name, data in df.items(): 
 print("col_name:",col_name, "\ndata:",data[1]) 

Обратите внимание, что индекс списка имеет нулевой индекс, поэтому data[1] будет относиться ко второй строке. Вы увидите этот вывод:

 col_name: first_name 
 data: Jane 
 col_name: last_name 
 data: Doe 
 col_name: age 
 data: 29 

Мы также можем передать значение индекса в data .

 for col_name, data in df.items(): 
 print("col_name:",col_name, "\ndata:",data['id002']) 

Результат будет таким же, как и раньше:

 col_name: first_name 
 data: Jane 
 col_name: last_name 
 data: Doe 
 col_name: age 
 data: 29 

Итерация DataFrames с помощью iterrows ()

Хотя df.items() выполняет итерацию по строкам по столбцам, выполняя цикл для каждого столбца, мы можем использовать iterrows() чтобы получить все данные строки индекса.

Попробуем перебрать строки с помощью iterrows() :

 for i, row in df.iterrows(): 
 print(f"Index: {i}") 
 print(f"{row}\n") 

В течение цикла, i представляю индекс столбец (наш DataFrame имеет индексы от id001 к id006 ) и row содержит данные для этого индекса во всех колонках. Наш результат будет выглядеть так:

 Index: id001 
 first_name John 
 last_name Smith 
 age 34 
 Name: id001, dtype: object 
 
 Index: id002 
 first_name Jane 
 last_name Doe 
 age 29 
 Name: id002, dtype: object 
 
 Index: id003 
 first_name Marry 
 last_name Jackson 
 age 37 
 Name: id003, dtype: object 
 
 ... 

Точно так же мы можем перебирать строки в определенном столбце. Просто передайте в row номер индекса или имя столбца . Например, мы можем выборочно распечатать первый столбец строки следующим образом:

 for i, row in df.iterrows(): 
 print(f"Index: {i}") 
 print(f"{row['0']}") 

Или же:

 for i, row in df.iterrows(): 
 print(f"Index: {i}") 
 print(f"{row['first_name']}") 

Оба они производят такой вывод:

 Index: id001 
 John 
 Index: id002 
 Jane 
 Index: id003 
 Marry 
 Index: id004 
 Victoria 
 Index: id005 
 Gabriel 
 Index: id006 
 Layla 

Итерация DataFrames с помощью itertuples ()

Функция itertuples() также возвращает генератор, который генерирует значения строк в кортежах. Давайте попробуем это:

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

Вы увидите это в своей оболочке Python:

 Pandas(Index='id001', first_name='John', last_name='Smith', age=34) 
 Pandas(Index='id002', first_name='Jane', last_name='Doe', age=29) 
 Pandas(Index='id003', first_name='Marry', last_name='Jackson', age=37) 
 Pandas(Index='id004', first_name='Victoria', last_name='Smith', age=52) 
 Pandas(Index='id005', first_name='Gabriel', last_name='Brown', age=26) 
 Pandas(Index='id006', first_name='Layla', last_name='Martinez', age=32) 

Метод itertuples() имеет два аргумента: index и name .

Мы можем отказаться от отображения столбца индекса, установив для параметра index False :

 for row in df.itertuples(index=False): 
 print(row) 

В наших кортежах больше не будет отображаться индекс:

 Pandas(first_name='John', last_name='Smith', age=34) 
 Pandas(first_name='Jane', last_name='Doe', age=29) 
 Pandas(first_name='Marry', last_name='Jackson', age=37) 
 Pandas(first_name='Victoria', last_name='Smith', age=52) 
 Pandas(first_name='Gabriel', last_name='Brown', age=26) 
 Pandas(first_name='Layla', last_name='Martinez', age=32) 

Как вы уже заметили, этот генератор выдает именованные кортежи с именем по умолчанию Pandas . Мы можем изменить это, передав аргумент People name . Вы можете выбрать любое имя, которое вам нравится, но всегда лучше выбирать имена, соответствующие вашим данным:

 for row in df.itertuples(index=False, name='People'): 
 print(row) 

Теперь наш вывод будет:

 People(first_name='John', last_name='Smith', age=34) 
 People(first_name='Jane', last_name='Doe', age=29) 
 People(first_name='Marry', last_name='Jackson', age=37) 
 People(first_name='Victoria', last_name='Smith', age=52) 
 People(first_name='Gabriel', last_name='Brown', age=26) 
 People(first_name='Layla', last_name='Martinez', age=32) 

Производительность итерации с помощью Pandas

Официальная документация Pandas предупреждает, что итерация - медленный процесс. Если вы перебираете DataFrame для изменения данных, векторизация будет более быстрой альтернативой. Кроме того, не рекомендуется изменять данные во время итерации по строкам, поскольку Pandas иногда возвращает копию данных в строке, а не ссылку на нее, что означает, что не все данные фактически будут изменены.

Для небольших наборов данных вы можете использовать метод to_string() для отображения всех данных. Для больших наборов данных, содержащих много столбцов и строк, вы можете использовать head(n) или tail(n) для распечатки первых n строк вашего DataFrame (значение по умолчанию для n равно 5).

Сравнение скорости

Чтобы измерить скорость каждого конкретного метода, мы заключили их в функции, которые будут выполнять их 1000 раз и возвращать среднее время выполнения.

Чтобы протестировать эти методы, мы будем использовать обе функции print() и list.append() чтобы предоставить более точные данные для сравнения и охватить распространенные варианты использования. Чтобы определить справедливого победителя, мы будем перебирать DataFrame и использовать только одно значение для печати или добавления в цикл.

Вот как выглядят возвращаемые значения для каждого метода:

Например, while items() будет циклически перемещаться по столбцу:

 ('first_name', 
 id001 John 
 id002 Jane 
 id003 Marry 
 id004 Victoria 
 id005 Gabriel 
 id006 Layla 
 Name: first_name, dtype: object) 

iterrows() предоставит все данные столбца для конкретной строки:

 ('id001', 
 first_name John 
 last_name Smith 
 age 34 
 Name: id001, dtype: object) 

И, наконец, одна строка для itertuples() будет выглядеть так:

 Pandas(Index='id001', first_name='John', last_name='Smith', age=34) 

Вот средние результаты в секундах:


Методика Скорость (с) Функция тестирования Предметы() 1,349279541666571 Распечатать() iterrows () 3,4104003086661883 Распечатать() itertuples () 0,41232967500279 Распечатать()



Методика Скорость (с) Функция тестирования Предметы() 0,006637570998767235 добавить () iterrows () 0,5749766406661365 добавить () itertuples () 0,3058610513350383 добавить ()


Печать значений потребует больше времени и ресурсов, чем добавление в целом, и наши примеры не являются исключением. Хотя itertuples() работает лучше в сочетании с print() , items() превосходит другие при использовании для append() а iterrows() остается последним для каждого сравнения.

Обратите внимание, что результаты этих тестов сильно зависят от других факторов, таких как ОС, среда, вычислительные ресурсы и т. Д. Размер ваших данных также будет влиять на ваши результаты.

Заключение

Мы узнали, как перебирать DataFrame с помощью трех разных методов Pandas

  • items() , iterrows() , itertuples() . В зависимости от ваших данных и предпочтений вы можете использовать один из них в своих проектах.
comments powered by Disqus