确定每个时间窗口单位记录了多少类别的用户

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

第二个我的输出不同 - 使用 Grouperfreq='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()”函数。顺序并不重要。再次感谢。

以上是关于确定每个时间窗口单位记录了多少类别的用户的主要内容,如果未能解决你的问题,请参考以下文章

教义记录应该做多少?

将逗号分隔属性另存为新记录

为每个类别python选择前10条记录

MYSQL 从每个类别中选择一个随机记录

如何检索每个类别的最后一条记录(更快的方式)

SQL中哪个字段类别记录日期和哪个字段类别记录时间