Счетчики для расчета частотного диапазона на основе значений в одном столбце, сгруппированных по другому - PullRequest
1 голос
/ 07 апреля 2020

У меня есть фрейм данных с 3 столбцами «UserProduct», «OrderDates» (отсортированный от максимального до минимального по группам) и «diff» (разница между первой датой и каждой из других дат для этой конкретной группы).

Я хочу создать 3 счетчика в диапазоне '0-30', '30 -60 ', '60 -90'

По сути, я хочу классифицировать различия (по дням) столбец в соответствии с диапазоном (например: если diff находится в диапазоне «0-30», счетчик 1 получает голос «1»

Пример ниже:


Входные данные:

       UserProduct              OrderDates       diff(in days)
0  12111211/123232   2020-03-12 17:19:16.103              0
1  12111211/123232   2020-03-12 18:10:45.974              0
2  12111211/123232   2020-03-11 17:19:16.103              1
3  12111211/123232   2020-03-10 18:10:45.974              2
4  12111211/123232   2020-03-10 18:10:45.974              2
5  165870101/73066   2020-03-12 19:49:15.752              0
6  165870101/73066   2020-02-11 19:49:15.752             31

Ожидаемый результат:

       UserProduct              OrderDates    diff(in days)     0-30      30-60   60-90
0  12111211/123232   2020-03-12 17:19:16.103              0    1+1+1=3    -        -
5  165870101/73066   2020-03-12 19:49:15.752              0     -          1        -

Во входных данных -> первое значение (OrderDates) для группа 12111211/123232 вычитается из последующих 4 (OrderDates), чтобы получить 0,1,2,2 (в днях)


На выходе -> для группы 12111211/123232, Только первая строка преобладает, а последующие значения diff (в днях) (все в диапазоне 0-30) способствуют тому, что первый счетчик получает 1 + 1 + 1 + 1 = 4


Мой код для получения на данный момент:

#to get top 5 records per user/product combination
bf_frequency =  bf.groupby(["UserProduct"])['ORDER_DATE'].nlargest(5).reset_index(name ='OrderDates') 

bf_frequency.sort_values(by=['OrderDates'],inplace=True, ascending=False)

bf_frequency['diff(in days)'] = 0

grp = bf_frequency.groupby('UserProduct')['OrderDates']

for i, group in grp:
    bf_frequency['diff(in days)'][bf_frequency.index.isin(group.index)] = group.sub(group.iloc[0])

bf_frequency['diff(in days)']= bf_frequency['diff(in days)'].dt.days.abs() 

У меня есть вывод, как показано во входных данных, но я хочу создать здесь счетчик

...