С Pandas, получить значение из одного столбца в dataframe (для каждой группы), на основе минимального значения второго столбца

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