Другой подход к этому, который, я думаю, должен быть довольно гибким:
dups = df.loc[:, ['User', 'Cookie']].duplicated()
diffs = df.Cookie != df.Cookie.shift()
flags = np.logical_and(dups, diffs)
df['flag'] = flags
result_1 = df.groupby(['User', 'Cookie'])['flag'].agg([('Count', sum)])
result_2 = result_1.groupby('User')['Count'].agg([('Reoccurred_Instances', lambda x: (x > 0).sum())])
Он будет принимать дубликаты в терминах User
и Cookie
, а затем будет сравнивать значения Cookie
со своими соседями. Наконец, добавьте столбец True
/ False
, соответствующий двум вышеупомянутым флагам. Используйте этот столбец для создания двух упомянутых вами сводных таблиц (result_1
и result_2
, ниже).
Count
User Cookie
1 A 2.0
B 1.0
C 0.0
D 2.0
E 0.0
2 F 1.0
G 1.0
H 0.0
Reoccurred_Instances
User
1 3.0
2 2.0
РЕДАКТИРОВАТЬ: Как уже упоминалось в комментарии ниже, давайте предположим, что третий пользователь со значениями Cookie H
, H
, H
, J
, J
, J
. Как это:
Sno User Cookie
0 1 1 A
1 2 1 A
2 3 1 A
3 4 1 B
4 5 1 C
5 6 1 D
6 7 1 A
7 8 1 B
8 9 1 D
9 10 1 E
10 11 1 D
11 12 1 A
12 13 2 F
13 14 2 G
14 15 2 F
15 16 2 G
16 17 2 H
17 18 2 H
18 19 3 H
19 20 3 H
20 21 3 H
21 22 3 J
22 23 3 J
23 24 3 J
Запустив этот код выше, мы получим следующие кадры данных результата:
Count
User Cookie
1 A 2.0
B 1.0
C 0.0
D 2.0
E 0.0
2 F 1.0
G 1.0
H 0.0
3 H 0.0
J 0.0
И
Reoccurred_Instances
User
1 3.0
2 2.0
3 0.0
При настройке кода все равно будет показан третий пользователь (у которого нет повторяющихся значений Cookie
) со значением Reoccurred_Instances
, равным 0.