2 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是一種常用的技術(shù),用于cumsum與diff閾值進(jìn)行比較來(lái)識(shí)別由閾值分隔的塊。就像是:
series.diff().gt('30Min').cumsum()
由于您想通過(guò) 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貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
你可以做雙重.groupby
:
如果時(shí)間超過(guò) 30 分鐘,您可以創(chuàng)建一個(gè)使用on并返回或 的
boolean series
調(diào)用,用于每個(gè)組中的每一行。s
.groupby
id
True
False
id
然后,您可以再次對(duì)步驟 1 中創(chuàng)建的進(jìn)行 groupby并返回累積計(jì)數(shù).cumsum
并加 1,以便從 1 而不是 0 開(kāi)始計(jì)數(shù)
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
添加回答
舉報(bào)