gpt4 book ai didi

python - 按开始/结束时间戳对数据帧行进行分组

转载 作者:行者123 更新时间:2023-12-04 14:48:41 25 4
gpt4 key购买 nike

我有一个应用程序日志,我正在将其拉入 Pandas 数据框,将每个事件的各个部分解析到单独的列中,类似于此:

data1 = {'timestamp': ['01-01-2021 12:00:00','01-01-2021 12:01:00','01-01-2021 12:02:00','01-01-2021 12:03:00','01-01-2021 12:04:00','01-01-2021 12:05:00','01-01-2021 12:06:00','01-01-2021 12:07:00','01-01-2021 12:08:00','01-01-2021 12:09:00','01-01-2021 12:10:00','01-01-2021 12:11:00','01-01-2021 12:12:00','01-01-2021 12:13:00','01-01-2021 12:14:00'],
'event': ['start','x','y','start','z','end','x','end','start','x','end','start','q','end','start'],
'account': ['bob','bob','bob','jane','bob','bob','jane','jane','todd','todd','todd','bob','bob','bob','ned'] }
df1 = pd.DataFrame(data1)
print(df1)

timestamp event account
0 01-01-2021 12:00:00 start bob
1 01-01-2021 12:01:00 x bob
2 01-01-2021 12:02:00 y bob
3 01-01-2021 12:03:00 start jane
4 01-01-2021 12:04:00 z bob
5 01-01-2021 12:05:00 end bob
6 01-01-2021 12:06:00 x jane
7 01-01-2021 12:07:00 end jane
8 01-01-2021 12:08:00 start todd
9 01-01-2021 12:09:00 x todd
10 01-01-2021 12:10:00 end todd
11 01-01-2021 12:11:00 start bob
12 01-01-2021 12:12:00 q bob
13 01-01-2021 12:13:00 end bob
14 01-01-2021 12:14:00 start ned

非常直截了当的日志。时间戳是字符串,但如果需要可以轻松转换为日期时间对象。日志列出了用户执行的各种操作,但我感兴趣的是生成用户帐户 session 的报告。像这样:

     account  start                end
0 bob 01-01-2021 12:00:00 01-01-2021 12:05:00
1 jane 01-01-2021 12:03:00 01-01-2021 12:07:00
2 todd 01-01-2021 12:08:00 01-01-2021 12:10:00
3 bob 01-01-2021 12:11:00 01-01-2021 12:13:00
4 ned 01-01-2021 12:14:00 NaN

按开始时间和结束时间分组很容易,但我无法弄清楚的问题是当用户在我查看的时间段内有多个 session 时如何执行此操作。在上面的伪日志数据中,Bob 打开了 2 个 session ,但理论上可能打开了 100 个 session ,具体取决于我正在查看的数据的日期范围。有问题的应用程序确实限制用户一次只能进行 1 个 session ,因此我不应该看到同一个帐户同时打开 2 个 session 。

当帐户在数据中可能有多个 session 时,如何按帐户将 session 开始/结束时间一起分组为 2 列?

最佳答案

尝试:

(df1.assign(idx=df1.event.eq('start').groupby(df1.account).cumsum())  # enumerate the `start` event by account
.loc[lambda x: x['event'].isin(['start','end'])] # only keep `start` and `end` events
.set_index(['idx','account','event']) # set index and unstack
['timestamp'].unstack() # then unstack
.reset_index(level=1).reset_index(drop=True) # tidying up
)

输出:

event account                  end                start
0 bob 01-01-2021 12:05:00 01-01-2021 12:00:00
1 jane 01-01-2021 12:07:00 01-01-2021 12:03:00
2 ned NaN 01-01-2021 12:14:00
3 todd 01-01-2021 12:10:00 01-01-2021 12:08:00
4 bob 01-01-2021 12:13:00 01-01-2021 12:11:00

关于python - 按开始/结束时间戳对数据帧行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69459668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com