pandas,groupby但只有一定数量

问题描述 投票:1回答:1

我有一个用户行为数据。用户查看项目。

user_id, item_id, timestamp
1, a, 1000
2, b, 1001
1, c, 1002
1, d, 1004
1, e, 1005
1, a, 1006
2, f, 1007

从概念上讲,我将此观看操作视为在会话中发生,并且希望构建会话。

(如果可以,我会查看时间戳,我可以用它来定义会话,但为了简单起见,我只是用固定的窗口大小进行分区)

对于窗口大小= 3和stride = 1(在示例中将清楚),我想将数据转换为以下格式

user_id, items 
1, [a,c,d]
2, [b,f]
1, [d, e, a]

因此,对于user_id 1,他/她的第一个会话包括查看[a,c,d],第二个会话[d,e,a]d重复,因为步幅= 1,如果步幅是2,第二次会议将是[c,d,e]

(按窗口大小对数据进行分区时,我希望窗口彼此重叠,大小等于stride)

如果stride实施太麻烦,我会放弃它。 (它就在那里,因为我是arbiltrarilly分区会话而不想丢失顺序信息)

pandas
1个回答
0
投票

这是一个应该有效的功能。 (我不保证它的表现与你在stride > gsize时的预期一样)。我对stride的定义略有不同。我把它作为自第一次开始新分组以来的观察次数:

import pandas as pd

def rolling_list(x, stride=1, gsize=3):
    if len(x) <= gsize:
        l = [list(x.to_list())]
    else:
        l = [x.iloc[i*stride:(i*stride)+gsize].to_list()
             for i in range(len(x)//gsize+(gsize-stride))]
    return pd.Series(l)

df.groupby('user_id').item_id.apply(rolling_list, stride=1)

#user_id   
#1        0    [a, c, d]
#         1    [c, d, e]
#         2    [d, e, a]
#         3    [e, a, z]
#2        0       [b, f]

df.groupby('user_id').item_id.apply(rolling_list, stride=2)
#user_id   
#1        0    [a, c, d]
#         1    [d, e, a]
#         2       [a, z]
#2        0       [b, f]
#Name: item_id, dtype: object

Sample Data (added an extra row)

user_id,item_id,timestamp
1,a,1000
2,b,1001
1,c,1002
1,d,1004
1,e,1005
1,a,1006
2,f,1007
1,z,1008
© www.soinside.com 2019 - 2024. All rights reserved.