общее количество групп по месяцам - PullRequest
0 голосов
/ 02 мая 2020

фрейм данных:

ID spend month_diff    
12  10    -5
12  10    -4
12  10    -3
12  10     1         
12  10    -2         
12  20     0        
12  30     2         
12  10    -1 

Я хочу получить spend_total на основе разницы в месяц для определенного идентификатора. month_diff в отрицательном значении означает расходы, потраченные клиентом в прошлом году, и положительное в этом году Итак, я хочу сравнить расходы клиентов за прошлый год и этот год. Итак, условия следующие: Условия:

  • if month_diff >= -2 and < 0 затем совокупные расходы за отрицательные месяцы -> flag=pre
  • if month_diff > 0 and <=2 затем совокупные расходы за положительные месяцы -> flag=post

Примечание: нет. month_diff +ve и -ve не совпадают. может быть так, что у клиента было 4 транзакции в -ve month_diff и только 2 транзакции в +ve, поэтому я хочу взять только 2-месячную совокупную сумму -ve month_diff и 2 для +ve и не хочу учитывать потратить, где month_diff равно 0.

Требуемый фрейм данных:

ID spend month_diff spend_tot   flag    
12  10    -2         20         pre
12  30     2         40        post

40 - совокупная сумма расходов для month_diff +1 и +2 (т.е. 10 + 30) и то же самое для month_diff -1 и -2 и его совокупные расходы равны 20 (т.е. 10 + 10

1 Ответ

0 голосов
/ 02 мая 2020

Использование:

#filter values by list
df = df[df['month_diff'].isin([1,2,-1,-2])]

#filter duplicated values with absolute values of month_diff
df = df[df.assign(a=df['month_diff'].abs()).duplicated(['ID','a'], keep=False)]
#sign column
a = np.sign(df['month_diff'])
#aggregate sum and last
df1 = (df.groupby(['ID', a])
         .agg({'month_diff':'last', 'spend':'sum'})
         .reset_index(level=1, drop=True)
         .reset_index())

df1['flag'] = np.select([df1['month_diff'].ge(-2) & df1['month_diff'].lt(0),
                         df1['month_diff'].gt(0) & df1['month_diff'].le(2)], 
                         ['pre','post'], default='another val')
print (df1)
   ID  month_diff  spend  flag
0  12          -1     20   pre
1  12           2     40  post
...