Избегайте использования функции iterrows ()

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

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

В этой статье мы обсудим методы или приемы, позволяющие ускорить итерационный процесс над наборами данных большого размера.

Встроенная функция Pandas: iterrows ()

iterrows () - это встроенная функция библиотеки Pandas, которая возвращает серию каждого экземпляра или строки. Он выполняет итерацию по фрейму данных в виде пары индексов и функций столбца в виде серии.

Чтобы сравнить контрольные временные ограничения, я использую набор данных, содержащий 10 миллионов записей и 5 столбцов. У нас есть функция‘name’ в наборе данных со строковым типом, которую необходимо удалить, чтобы удалить пробелы.

temp=[]
for i,row in df.iterrows():
name_new = row['name'].strip()
temp.append(name_new)

На выполнение фрагмента кода ушло около 1967 секунд, включая наведение курсора на фрейм данных и выполнение функции удаления значений «name».

Не рекомендуется использовать iterrows не только из-за проблем с производительностью времени, но также из-за того, что функция iterrows() не сохраняет типы данных по строкам. Вы можете использовать itertuples() функцию, сохраняющую типы.

Теперь давайте узнаем другие методы перебора фрейма данных и сравнения его временной сложности.

Итерация по индексу:

Dataframes - это Pandas-объект со строками и столбцами. Строки и столбцы фрейма данных индексируются, и можно перебирать индексы в цикле для перебора строк.

temp=[]
for idx in range(0,df.shape[0],1):
name_new = df['name'].iloc[idx].strip()
temp.append(name_new)

Потребовалось почти 223 секунды (примерно в 9 раз быстрее, чем функция iterrows), чтобы перебрать фрейм данных и выполнить операцию полосы.

Использование to_dict ():

Вы можете перебирать фрейм данных и выполнять операции с молниеносной скоростью, просто преобразовав фрейм данных Pandas в словарь. Вы можете использовать функцию .to_dict() в Pandas для преобразования фрейма данных в словарь. Теперь перебор словаря сравнительно очень быстр по сравнению с функцией iterrows().

df_dict = df.to_dict('records')
temp=[]
for row in df_dict:
name_new = row['name'].strip()
temp.append(name_new)

Для перебора словарного формата набора данных требуется около 25 записей, что в 77 раз быстрее, чем функция iterrows().

Использование apply ():

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

temp = df['name'].apply(lambda x: x.strip())

apply() выполнение функции занимает 4,60 секунды, что в 427 раз быстрее, чем функция iterrows().

Из вышеупомянутого изображения (начало этой статьи) вы можете сравнить контрольные временные числа, рассчитанные для системы с 8 ядрами и 32 ГБ ОЗУ.

Заключение:

В этой статье мы обсудили несколько методов итерации по фрейму данных Pandas и сравнили их временную сложность. В особых случаях рекомендуется использовать функцию iterrows(). Можно легко перейти от использования iterrows() или индексирования к методике итерации на основе словаря, которая ускоряет рабочий процесс в 77 раз.

Функция Apply работает примерно в 400 раз быстрее, но имеет ограниченное использование, и для перехода к этому подходу необходимо внести много изменений в код. Я лично конвертирую свой фрейм данных в словарь, а затем продолжаю итерацию.

Использованная литература:

[1] Документация Pandas: https://pandas.pydata.org/docs/index.html

Понравилась статья? Станьте средним участником, чтобы продолжить обучение без ограничений. Если вы воспользуетесь следующей ссылкой, я получу небольшую часть вашего членского взноса без каких-либо дополнительных затрат.



Спасибо за чтение