общая сегментация на основе нескольких условий - PullRequest
1 голос
/ 26 апреля 2020

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

ID spend month_diff    
12  10    -1         
12  10    -2         
12  20     1        
12  30     2         
13  15    -1         
13  20    -2        
13  25     1        
13  30     2        

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

Условия: -

if month_diff >= -2 and < 0 then cumulative spend for negative months - flag=pre
if month_diff > 0 and <=2 then  cumulative spend for positive months  - flag=post

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

ID spend month_diff tot_spend   flag    
12  10    -2         20         pre
12  30     2         50         post
13  20    -2         35         pre
13  30     2         55         post

1 Ответ

1 голос
/ 26 апреля 2020

Используйте numpy.sign с Series.shift, Series.ne и Series.cumsum для последовательных групп и перейдите к DataFrame.groupby с совокупностью GroupBy.last и sum.

Последнее использование numpy.select:

a = np.sign(df['month_diff'])
g = a.ne(a.shift()).cumsum()
df1 = (df.groupby(['ID', g])
         .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          -2     20   pre
1  12           2     50  post
2  13          -2     35   pre
3  13           2     55  post
...