как сохранить первую запись по ID? pandas python - PullRequest
2 голосов
/ 07 мая 2020

pk_cid означает идентификатор клиента. Каждый pk_partition представляет текущее состояние месяца em_acount (который является проданным продуктом). Таким образом, если у клиента есть 1 в январе, а также 1 в феврале, это означает, что он совершил покупку только один раз в январе. Я хотел бы изменить остальные месяцы так, чтобы они имели 0, если в предыдущем месяце было 1, чтобы точно увидеть время, когда люди покупают только первый месяц.

если это возможно, с другой стороны, если человек остался, чтобы иметь -1

Это то, что у меня есть

вы можете создать pandas. Серия:

a = pd.Series({(15891, '2018-07-28'): 1,
 (15891, '2018-08-28'): 0,
 (16063, '2018-11-28'): 0,
 (16063, '2018-12-28'): 0,
 (16063, '2019-01-28'): 0,
 (16063, '2019-02-28'): 0,
 (16063, '2019-03-28'): 0,
 (16063, '2019-04-28'): 0,
 (16063, '2019-05-28'): 0,
 (16203, '2018-12-28'): 0,
 (16203, '2019-01-28'): 1,
 (16203, '2019-02-28'): 1,
 (16203, '2019-03-28'): 1,
 (16203, '2019-04-28'): 1,
 (16203, '2019-05-28'): 1,
 (16502, '2018-09-28'): 0,
 (16502, '2018-10-28'): 1,
 (16502, '2018-11-28'): 1,
 (16502, '2018-12-28'): 1,
 (16502, '2019-01-28'): 1})

Желаемый результат

введите описание изображения здесь

Спасибо

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Отсортируйте индекс, затем groupby user_id получите pct_change и установите значения 0, если изменение <= 0:

serie = pd.Series( {(15891, '2018-07-28'): 1, (15891, '2018-08-28'): 0,
                    (16063, '2018-11-28'): 0, (16063, '2018-12-28'): 0,
                    (16063, '2019-01-28'): 0, (16063, '2019-02-28'): 0, 
                    (16063, '2019-03-28'): 0, (16063, '2019-04-28'): 0, 
                    (16063, '2019-05-28'): 0, (16203, '2018-12-28'): 0, 
                    (16203, '2019-01-28'): 1, (16203, '2019-02-28'): 1, 
                    (16203, '2019-03-28'): 1, (16203, '2019-04-28'): 1, 
                    (16203, '2019-05-28'): 1, (16502, '2018-09-28'): 0, 
                    (16502, '2018-10-28'): 1, (16502, '2018-11-28'): 1, 
                    (16502, '2018-12-28'): 1, (16502, '2019-01-28'): 1})

serie.sort_index(inplace=True)
serie [serie.groupby(level=0).pct_change() <= 0 ] = 0
serie

# 15891 2018-07-28 1
#       2018-08-28 0
# 16063 2018-11-28 0
#       2018-12-28 0
#       2019-01-28 0
#       2019-02-28 0
#       2019-03-28 0
#       2019-04-28 0
#       2019-05-28 0
# 16203 2018-12-28 0
#       2019-01-28 1
#       2019-02-28 0
#       2019-03-28 0
#       2019-04-28 0
#       2019-05-28 0
# 16502 2018-09-28 0
#       2018-10-28 1
#       2018-11-28 0
#       2018-12-28 0
#       2019-01-28 0
0 голосов
/ 07 мая 2020

Я думаю, что этот лог c правильный, но он предполагает, что ваши даты упорядочены в вашем индексе.

s = pd.Series( {(15891, '2018-07-28'): 1, (15891, '2018-08-28'): 0,
                (16063, '2018-11-28'): 0, (16063, '2018-12-28'): 0,
                (16063, '2019-01-28'): 0, (16063, '2019-02-28'): 0, 
                (16063, '2019-03-28'): 0, (16063, '2019-04-28'): 0, 
                (16063, '2019-05-28'): 0, (16203, '2018-12-28'): 0, 
                (16203, '2019-01-28'): 1, (16203, '2019-02-28'): 1, 
                (16203, '2019-03-28'): 1, (16203, '2019-04-28'): 1, 
                (16203, '2019-05-28'): 1, (16502, '2018-09-28'): 0, 
                (16502, '2018-10-28'): 1, (16502, '2018-11-28'): 1, 
                (16502, '2018-12-28'): 1, (16502, '2019-01-28'): 1})
# groupby level 0
g = s.groupby(level=0)
# create a mask based on your logic
mask = ((g.shift(0)==1) & (g.shift(-1)==1) & (g.shift()==1)) | \
       ((g.shift(0)==1) & (g.shift(-1).isna()) & (g.shift()==1)) | \
       ((g.shift(0)==1) & (g.shift(-1)==0) & (g.shift()==1))
# assign all true values to 0
s[mask] = 0
print(s)

15891  2018-07-28    1
       2018-08-28    0
16063  2018-11-28    0
       2018-12-28    0
       2019-01-28    0
       2019-02-28    0
       2019-03-28    0
       2019-04-28    0
       2019-05-28    0
16203  2018-12-28    0
       2019-01-28    1
       2019-02-28    0
       2019-03-28    0
       2019-04-28    0
       2019-05-28    0
16502  2018-09-28    0
       2018-10-28    1
       2018-11-28    0
       2018-12-28    0
       2019-01-28    0
...