第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

DataFrame 新列按時(shí)間差分割會(huì)話 - pandas

DataFrame 新列按時(shí)間差分割會(huì)話 - pandas

aluckdog 2023-12-09 15:41:45
我有以下排序的數(shù)據(jù)框:import pandas as pdhits = {'id': ['A','A','A','A','B','B','C','C'],        'datetime': ['2010-01-02 03:00:00','2010-01-02 03:05:10','2010-01-02 03:51:35','2010-01-02 04:40:20',                    '2010-01-02 03:29:10','2010-01-02 03:29:15','2010-01-02 03:45:20','2010-01-02 06:10:05'],        'value': [1,2,2,1,1,3,2,4]       }df = pd.DataFrame(hits, columns = ['id', 'datetime','value'])df['datetime'] =  pd.to_datetime(df['datetime'], format='%Y-%m-%d %H:%M:%S')print (df)  id            datetime  value0  A 2010-01-02 03:00:00      11  A 2010-01-02 03:05:10      22  A 2010-01-02 03:51:35      23  A 2010-01-02 04:40:20      14  B 2010-01-02 03:29:10      15  B 2010-01-02 03:29:15      36  C 2010-01-02 03:45:20      27  C 2010-01-02 06:10:05      4該列id允許我區(qū)分獨(dú)特的用戶,但我想向前邁出一步,能夠按會(huì)話對(duì)點(diǎn)擊進(jìn)行分組。一次會(huì)話定義為不活動(dòng)時(shí)間不超過(guò) 30 分鐘的所有用戶活動(dòng)。在我的 DataFrame 中,所需的輸出應(yīng)該是:  id            datetime  value  session0  A 2010-01-02 03:00:00      1        11  A 2010-01-02 03:05:10      2        12  A 2010-01-02 03:51:35      2        23  A 2010-01-02 04:40:20      1        34  B 2010-01-02 03:29:10      1        15  B 2010-01-02 03:29:15      3        16  C 2010-01-02 03:45:20      2        17  C 2010-01-02 06:10:05      4        2在中SQL,我將首先使用lag來(lái)計(jì)算點(diǎn)擊次數(shù)之間的差異partition by id order by datetime asc,然后在新的查詢中,我sum(case when diff > 30min then 1 else 0 end)也將按 id 進(jìn)行分區(qū)。Pandas 有類似的東西嗎?
查看完整描述

2 回答

?
牧羊人nacy

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


查看完整回答
反對(duì) 回復(fù) 2023-12-09
?
慕村225694

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊

你可以做雙重.groupby

  1. 如果時(shí)間超過(guò) 30 分鐘,您可以創(chuàng)建一個(gè)使用on并返回或 的boolean series調(diào)用,用于每個(gè)組中的每一行。s.groupbyidTrueFalse

  2. 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


查看完整回答
反對(duì) 回復(fù) 2023-12-09
  • 2 回答
  • 0 關(guān)注
  • 179 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)