#python #pandas #оптимизация #dataframe #group_by
Имеется dataframe из двух столбцов.
Группируя по первому, суммирую значения по втором. Делаю двумя способами
df.groupby('col1')['col2'].sum()
Скорость выполнения: 0,01 сек
df.groupby('col1')['col2'].apply(lambda x: x.sum())
Скорость выполнения: 4,15 сек
Почему такая разница в скорости?
Как ускорить работу, если нужна будет не просто сумма, а более сложная функция?
Например,
df.groupby('col1')['col2'].apply(lambda x: ','.join([str(i) for i in x]))
Ответы
Ответ 1
Series.apply() и DataFrame.apply(...) - являются "не совсем векторизированными" функциями, которые чаще всего значительно медленнее своих векторизированных аналогов. К сожалению, серебрянной пули универсального и быстрого решения не существует. Так что подход обычно следующий: если есть вектроизированная функция для решения нашей конкретной задачи, то используем ее сравниваем скорость работы .apply() и обычного list comprehension и выбираем самый быстрый вариант. NOTE: при работе со строками (object dtype) list comprehension часто оказывается быстрее .apply() и иногда быстрее соответствующих векторизированных Series.str.методов если скорость не устраивает то пробуем один из подходов, рекоммендованных разработчиками Pandas: Cython Numba pd.eval()
Комментариев нет:
Отправить комментарий