Избегайте использования функции 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
Понравилась статья? Станьте средним участником, чтобы продолжить обучение без ограничений. Если вы воспользуетесь следующей ссылкой, я получу небольшую часть вашего членского взноса без каких-либо дополнительных затрат.
Спасибо за чтение