#python #pandas #pandas-groupby
#python #pandas #pandas-groupby
Вопрос:
Предположим, у нас есть dataframe с 3 столбцами: the_customer
, the_date
, и the_amount
. Нам нужно создать dataframe, который для каждого пользователя the_amount
связан с самым ранним / минимальным значением the_date
для каждого пользователя. Вот что мы делаем до сих пор:
each_users_first_amount = our_data[['the_customer', 'the_date', 'the_amount']]
.sort_values(by='the_date', ascending = True)
.groupby('the_customer', as_index=False)
.apply(lambda x: x.head(1))
.rename(columns = { 'the_date': 'earliest_date', 'the_amount': 'first_amount' })
Этот подход технически работает, однако по какой-то причине эта функция работает очень медленно с нашими данными, и я не уверен, какой метод в цепочке заставляет функцию работать медленно ( .apply
?). Это также кажется «хакерским», в частности, строка .apply(lambda x: x.head(1))
, которая используется head
для захвата первой строки, которая работает, потому что мы ранее отсортировали.
В частности, возможно, было бы полезно, если бы это можно было сделать .agg()
каким-либо образом, поскольку мы уже используем .agg()
в другой цепочке методов группировку данных и вычисление сгруппированных по метрикам.
Ответ №1:
Использование агрегированной функции неэффективно для фреймов данных большего размера, она потребляет больше времени, чем взаимодействие при работе с большими фреймами данных. Однако в вашем коде применить функцию или итерацию — единственный возможный вариант, поэтому вы не можете его заменить. Но я думаю, что процесс, требующий времени в коде, — это сортировка. Использование сортировки после groupby может уменьшить временную сложность, поскольку сортировка множества небольших подмножеств будет проще, чем сортировка всего фрейма данных.