Python Pandas Запрос для получения даты на основе максимального значения после использования Group By - PullRequest
0 голосов
/ 10 октября 2019

Я новичок в Python / Pandas. У меня есть 2 фрейма данных.

df1 содержит данные уровня заголовка кредитных карт. df2 содержит подробные данные транзакций кредитных карт.

'card_id' - это общий столбец между двумя фреймами данных.

В df1 каждый card_id будет отображаться только один раз, но в df2 он можетпоявляются несколько раз.

df1.head()

  first_active_month          card_id  feature_1  feature_2  feature_3  \
0            2017-06  C_ID_92a2005557          5          2          1   
1            2017-01  C_ID_3d0044924f          4          1          0   
2            2016-08  C_ID_d639edf6cd          2          2          0   
3            2017-09  C_ID_186d6a6901          4          3          0   
4            2017-11  C_ID_cdbd2c0db2          1          3          0   

     target  
0 -0.820283  
1  0.392913  
2  0.688056  
3  0.142495  
4 -0.159749  




df2.head()

   Unnamed: 0 authorized_flag          card_id  city_id category_1  \
0    13292136               Y  C_ID_2797657938      101          N   
1    20069042               Y  C_ID_7a238b3713       69          N   
2     5029656               Y  C_ID_e2a496605f       17          N   
3    16356907               N  C_ID_321a031e15       -1          Y   
4     8203441               Y  C_ID_fcf33361c2       17          N   

   installments category_3  merchant_category_id      merchant_id  month_lag  \
0             3          C                   690  M_ID_57483ffa85         -3   
1             1          B                   879  M_ID_00a6ca8a8a         -3   
2             0          A                   705  M_ID_12d0a993b5         -6   
3             1          B                   661  M_ID_fc7d7969c3         -6   
4             0          A                   278  M_ID_7c758dfc19         -2   

   purchase_amount        purchase_date  category_2  state_id  subsector_id  
0        -0.491487  2017-11-09 23:10:20         4.0         4             1  
1        -0.721363  2017-11-27 14:08:07         1.0         9            29  
2        -0.738057  2017-07-09 14:16:01         4.0        22            33  
3        -0.712497  2017-08-28 06:56:25         NaN        -1             8  
4        -0.618131  2017-12-16 13:53:59         4.0        22            37  

Я хочу добиться следующего: найти для каждой карты мм-гг, чтобы достичь максимального значения buy_amount. А затем найдите количество месяцев, которое потребовалось для достижения этого мм-года с даты «первого включения».

Пример: Card_id C_ID_2797657930 «первый актив» 1 января 2019 года (из данных в df1). Предполагается, что из всех отдельных транзакций по этой карте, представленных в df2, транзакция с максимальной суммой была совершена 1 мая 2019 года. Таким образом, здесь количество месяцев, которое потребовалось, было 5-м месяцем минус 1-й месяц, т.е. 4 месяца. Точно так же я хочу, чтобы этот период рассчитывался для каждого card_id с использованием df1 и df2. Чтобы получить часть решения, я попробовал приведенный ниже код, но он дает мне странный результат.

result = df2.groupby(['card_id'], as_index=False)['purchase_date'].count()\
         .sort_values('purchase_date', ascending=False)\
         .drop_duplicates('purchase_date')

The result I am getting is:
                card_id  purchase_date
76694   C_ID_3d3dfdc692           1145
15996   C_ID_0cd2ce025c            607
255056  C_ID_cc3d4cd4e3            426
115988  C_ID_5ccc07beb9            407
118364  C_ID_5ea401d358            358
46516   C_ID_2524b5234d            343
199456  C_ID_9f81506906            338
48972   C_ID_272aa0597a            329
199304  C_ID_9f63809b99            327
172351  C_ID_89d1b0c84e            317

Итак, чтобы разбить мой вопрос на части:

  • Step-1: группа df2 по card_id
  • Шаг 2: в df2 для каждого card_id найдите максимальную «сумму покупки»
  • Шаг 3: найдите «дату покупки», соответствующуюмаксимальное количество шаг-2. Если существует более 1 даты, то должна быть выбрана самая ранняя дата. Давайте назовем эту дату шага 3 как HVDATE (Дата наибольшего значения)
  • Шаг 4: Теперь вычтите «первую активную дату» (из df1) из HVDATE (из df2), чтобы получить количество месяцев (мм) потребовалось, чтобы достичь этой максимальной сделки. Сделайте это для каждой карты.

Я уже просмотрел следующие сообщения: это , это , это , это , это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...