Я новичок в 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), чтобы получить количество месяцев (мм) потребовалось, чтобы достичь этой максимальной сделки. Сделайте это для каждой карты.
Я уже просмотрел следующие сообщения: это , это , это , это , это .