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
添加回答
舉報