确定每个时间窗口单位记录了多少类别的用户
Posted
技术标签:
【中文标题】确定每个时间窗口单位记录了多少类别的用户【英文标题】:Determine in how many categories users are logged per time window unit 【发布时间】:2022-01-18 12:53:03 【问题描述】:我有一个用户日志以及它记录在哪个类别中。用户可以登录多个类别。我想确定哪些用户登录了多个类别。日志很长,所以最好地将它对在大多数类别的顶部的用户身上进行排序。
user | category |
---|---|
1 | A |
1 | B |
2 | A |
3 | A |
3 | B |
目前使用 group_by 我只能显示计数,但不能显示类别的名称。大多数现有问题通常都在询问其他方式(例如,在类别中有多少用户)。我想做这样的事情:
user | categories | count |
---|---|---|
1 | A, B | 2 |
2 | A | 1 |
3 | A, B | 2 |
为了使它更复杂,我想确定相同的,但我也想知道用户是否在特定时间窗口(例如 5 分钟)内登录了多个类别:
timestamp | user | category |
---|---|---|
2021-12-12 13:00:00 | 1 | A |
2021-12-12 13:06:00 | 1 | B |
2021-12-12 13:08:00 | 2 | A |
2021-12-12 13:09:00 | 1 | B |
2021-12-12 13:14:00 | 3 | A |
2021-12-12 13:15:00 | 3 | B |
2021-12-12 13:15:00 | 3 | A |
2021-12-12 13:15:00 | 1 | B |
我想要像下面这样的东西(但对不同的显示方法开放),所以每个用户的类别有点按时间窗口分类(在本例中为 5 分钟):
timestamp | user | categories | count |
---|---|---|---|
2021-12-12 13:00:00 | 1 | A | 1 |
2021-12-12 13:05:00 | 1 | B | 1 |
2021-12-12 13:05:00 | 2 | A | 1 |
2021-12-12 13:05:00 | 1 | B | 1 |
2021-12-12 13:10:00 | 3 | A | 1 |
2021-12-12 13:15:00 | 3 | B, A | 2 |
2021-12-12 13:15:00 | 1 | B | 1 |
我尝试了各种组合 .resample、groub_by 和 .cumsum 的东西,但没有任何运气。我希望这些例子有意义。
【问题讨论】:
【参考方案1】:按列使用GroupBy.agg
user
:
df1 = (df.groupby('user', as_index=False)
.agg(categories=('category', ','.join), counts=('category', 'size')))
print (df1)
user categories counts
0 1 A,B 2
1 2 A 1
2 3 A,B 2
第二个我的输出不同 - 使用 Grouper
和 freq='5min'
:
df2 = (df.groupby(['user', pd.Grouper(freq='5min', key='timestamp')])
.agg(categories=('category', ','.join), counts=('category', 'size'))
.reset_index()
.sort_values('timestamp', ignore_index=True))
print (df2)
user timestamp categories counts
0 1 2021-12-12 13:00:00 A 1
1 1 2021-12-12 13:05:00 B,B 2
2 2 2021-12-12 13:05:00 A 1
3 3 2021-12-12 13:10:00 A 1
4 1 2021-12-12 13:15:00 B 1
5 3 2021-12-12 13:15:00 B,A 2
编辑:
df3 = (df.groupby(['user', pd.Grouper(freq='5min', key='timestamp')])
.agg(categories=('category', lambda x: ','.join(set(x))),
counts=('category', 'nunique'))
.reset_index()
.sort_values('timestamp', ignore_index=True))
print (df3)
user timestamp categories counts
0 1 2021-12-12 13:00:00 A 1
1 1 2021-12-12 13:05:00 B 1
2 2 2021-12-12 13:05:00 A 1
3 3 2021-12-12 13:10:00 A 1
4 1 2021-12-12 13:15:00 B 1
5 3 2021-12-12 13:15:00 B,A 2
【讨论】:
英雄!感谢您的快速帮助,很高兴了解 Grouper 功能。 虽然有一个限制,目前该逻辑加入并计算用户所在的所有类别,但它也计算非唯一类别。我需要在类别中并仅计算唯一类别。所以 B 类,B 的计数为 2,应该是 B 类,计数为 1。 @Mick - 顺序在连接值中很重要? 我从来不知道 Python 的“set()”函数。顺序并不重要。再次感谢。以上是关于确定每个时间窗口单位记录了多少类别的用户的主要内容,如果未能解决你的问题,请参考以下文章