Pandas groupby用户并计算2个时间戳之间的事件数

dz6r00yl  于 2022-12-09  发布在  其他
关注(0)|答案(1)|浏览(125)

我有一个DF 1,其中每一行代表一个“事件”。每个事件都有“用户”和“时间”列:

DF1:

"user","time"
user1,2022-11-14 00:00:04 
user2,2022-11-16 21:34:45
user1,2022-11-14 00:15:22
user3,2022-11-17 15:32:25
...

“time”值是一周内的任何时间戳:从2022年11月14日到2022年11月20日。有10000个不同的用户和2700万个事件。
我必须将一周划分为8个小时的时间段(总共21个时间段),对于每个用户,我需要查看是否可以在每个时间段中看到该用户的任何事件。
然后,我应该创建一个DF 2(其中每行都是一个用户),它有21列(每个插槽一列),列号为0或1:如果在该插槽中未看到用户,则为0;如果在该插槽中看到用户,则为1。

第二次飞行时间:

"user","slot1","slot2","slot3",...,"slot21"
user1,1,0,0,0,0,0,...,0
user2,0,0,1,1,1,0,...,0
user3,1,1,1,0,0,1,...,1
...

(之后,我将需要订购DF 2并将其绘制为备用矩阵,但那是另一回事...)
我设法填充了1个单行DF 2,但1个用户持续30秒,方式如下:

slots = pd.date_range('2022-11-14', periods=22, freq='8h')
row=[]
for i in np.arange(0,slots.value_counts().sum()-1):
    if DF1[(DF1.user=="user1")&(DF1.time.between(slots[i],slots[i+1]))].shape[0] >=1:
        row.append(1)
    else:
        row.append(0)
print(row)

因此,为1万名用户进行此过程将持续近4天...
有没有人知道我怎样才能更快地创建DF 2??也许像DF1.groupby('user').time这样的东西,然后还有什么?我可以用Pandas或任何其他方式,甚至不同的语言,如果我得到DF 2中的备用矩阵!
任何帮助都将不胜感激!

jdzmm42g

jdzmm42g1#

crosstabcut一起用于计数值,如果需要0,1输出,则比较不等于0并转换为整数:

df = (pd.crosstab(df['user'], 
                 pd.cut(df['time'], bins=slots, labels=False))
        .ne(0)
        .astype(int)
        .add_prefix('slot'))

相关问题