#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()
Комментариев нет:
Отправить комментарий