2 回答
TA贡献1862条经验 获得超7个赞
这是一种常用的技术,用于cumsum与diff阈值进行比较来识别由阈值分隔的块。就像是:
series.diff().gt('30Min').cumsum()
由于您想通过 id 查找块,因此只需将其包装在groupby():
df['session'] = (df.groupby('id')['datetime']
.transform(lambda x: x.diff().gt('30Min').cumsum())
)
输出:
id datetime value session
0 A 2010-01-02 03:00:00 1 0
1 A 2010-01-02 03:05:10 2 0
2 A 2010-01-02 03:51:35 2 1
3 A 2010-01-02 04:40:20 1 2
4 B 2010-01-02 03:29:10 1 0
5 B 2010-01-02 03:29:15 3 0
6 C 2010-01-02 03:45:20 2 0
7 C 2010-01-02 06:10:05 4 1
TA贡献1880条经验 获得超4个赞
你可以做双重.groupby
:
如果时间超过 30 分钟,您可以创建一个使用on并返回或 的
boolean series
调用,用于每个组中的每一行。s
.groupby
id
True
False
id
然后,您可以再次对步骤 1 中创建的进行 groupby并返回累积计数.cumsum
并加 1,以便从 1 而不是 0 开始计数
df['session'] = (df.assign(session=(df.groupby('id')['datetime'].diff() > '00:30:00')
.astype(int))
.groupby('id')['session'].cumsum() + 1)
Out[1]:
id datetime value session
0 A 2010-01-02 03:00:00 1 1
1 A 2010-01-02 03:05:10 2 1
2 A 2010-01-02 03:51:35 2 2
3 A 2010-01-02 04:40:20 1 3
4 B 2010-01-02 03:29:10 1 1
5 B 2010-01-02 03:29:15 3 1
6 C 2010-01-02 03:45:20 2 1
7 C 2010-01-02 06:10:05 4 2
添加回答
举报