这个问题是我问的这个问题的延续 here :
现在我有这样的数据:
Sno User Cookie
1 1 A
2 1 A
3 1 A
4 1 B
5 1 C
6 1 D
7 1 A
8 1 B
9 1 D
10 1 E
11 1 D
12 1 A
13 2 F
14 2 G
15 2 F
16 2 G
17 2 H
18 2 H
假设我们有用户 1“A、B、C、D、E”的 5 个 Cookie。现在我想统计遇到新的 cookie 后是否有任何 cookie 再次出现。例如,在上面的例子中,cookie A 在第 7 个位置再次遇到,然后也在第 12 个位置遇到。注意:我们不会将 A 计入第二位,因为它同时出现,但在第七位和第 12 位,我们在再次看到 A 之前看到了许多新的 cookie,因此我们计入该实例。因此,如果我运行 previous post 中提到的代码,我将得到以下结果: :
对于用户 1
Sno Cookie Count
1 A 2
2 B 1
3 C 0
4 D 2
5 E 0
对于用户2
Sno Cookie Count
6 F 1
7 G 1
8 H 0
现在到了棘手的部分,现在我们通过计数知道,对于用户 1,三个 cookie“A、B 和 D”重新出现。类似地,对于用户 2,“F 和 G”再次出现。我想像这样汇总这些结果:
Sno User Reoccurred_Instances
1 1 3
2 2 2
有没有更简单的方法而不使用循环来获得这个结果。
最佳答案
按照与我回答上一个问题时相同的第一步,删除连续的 Cookie
值并查找重复项:
no_doubles = df[df.Cookie != df.Cookie.shift()]
no_doubles['dups'] = no_doubles.Cookie.duplicated()
然后使用 groupby 按 User
对确实重复的数据子集 (no_doubles[no_doubles['dups']]
) 进行分组,并找到数字使用 nunique
为每个用户提供唯一的 Cookie
:
no_doubles[no_doubles['dups']].groupby('User')['Cookie'].nunique().reset_index()
这将返回:
User Cookie
0 1 3
1 2 2
您可以根据需要重命名列
[编辑]:
要处理不同的情况,您只需添加此逻辑即可。例如,考虑以下数据帧,User
编号 3 中没有重复:
Sno User Cookie
1 1 A
2 1 A
3 1 A
4 1 B
5 1 C
6 1 D
7 1 A
8 1 B
9 1 D
10 1 E
11 1 D
12 1 A
13 2 F
14 2 G
15 2 F
16 2 G
17 2 H
18 2 H
18 3 H
18 3 I
18 3 J
你可以这样做:
no_doubles = df[(df.Cookie != df.Cookie.shift()) | (df.User != df.User.shift())]
no_doubles['dups'] = no_doubles.duplicated(['Cookie', 'User'])
no_doubles.groupby('User').apply(lambda x: x[x.dups]['Cookie'].nunique()).to_frame('Reoccurred_Instances')
获取:
Reoccurred_Instances
User
1 3
2 2
3 0
关于python - 计算 python 中某个值相对于另一个值聚合的重复出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52083723/