亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python/Pandas 基于窗口將關閉事件分組在一起

Python/Pandas 基于窗口將關閉事件分組在一起

月關寶盒 2023-09-12 17:29:05
我想將緊密發生的事件分組到父事件中。一個例子是這樣的:import pandas as pddf = pd.DataFrame(    [        ['2020-01-01 10:00', '1'],        ['2020-01-01 10:01', '2'],        ['2020-01-01 10:02', '3a'],        ['2020-01-01 10:02', '3b'],        ['2020-01-01 10:30', '4'],        ['2020-01-01 10:50', '5'],        ['2020-01-01 10:54', '6'],        ['2020-01-01 10:55', '7'],    ], columns=['event_time', 'event_id'])df['event_time'] = pd.to_datetime(df['event_time'])在上面的窗口大小為 1 分鐘的示例中,我想要的是每個事件的 +- 1 分鐘內發生的所有其他事件的列表。所以像這樣:df = pd.DataFrame(    [        ['2020-01-01 10:00', '1', ['2']],        ['2020-01-01 10:01', '2', ['1','3a','3b']],        ['2020-01-01 10:02', '3a', ['2','3b']],        ['2020-01-01 10:02', '3b', ['3a', '2'],        ['2020-01-01 10:30', '4', None],        ['2020-01-01 10:50', '5', None],        ['2020-01-01 10:54', '6', ['7']],        ['2020-01-01 10:55', '7', ['6']],    ], columns=['event_time', 'event_id', 'related_event_id_list'])我幾乎能夠接近 pandas merge_asof:pd.merge_asof(df,df, on="event_time", tolerance=pd.Timedelta("1m"), allow_exact_matches=False, direction='nearest')但它似乎只想合并到一個最近的事件,而不是某種選項或方式來合并每行容差內的所有事件(顯然只是在我的結果中獲得更多行,因此它更像是范圍)。我認為對這樣的時間序列事件進行分組一定是相當常見的,但在 Pandas 中找不到任何明顯的函數來做到這一點,或者也許我錯過了一些東西。一如既往,如果我可以避免的話,盡量避免自己通過循環或類似的方式編寫代碼:)
查看完整描述

1 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

一個想法是過濾DataFrame每行并刪除原始行DataFrame.drop

td = pd.Timedelta("1m")

f = lambda x, y: df.loc[df['event_time'].between(y - td, y + td),

? ? ? ? ? ? ? ? ? ? ? ? 'event_id'].drop(x).tolist()

df['related_event_id_list'] = [f(k, v) for k, v in df['event_time'].items()]

print (df)

? ? ? ? ? ?event_time event_id related_event_id_list

0 2020-01-01 10:00:00? ? ? ? 1? ? ? ? ? ? ? ? ? ?[2]

1 2020-01-01 10:01:00? ? ? ? 2? ? ? ? ? ?[1, 3a, 3b]

2 2020-01-01 10:02:00? ? ? ?3a? ? ? ? ? ? ? ?[2, 3b]

3 2020-01-01 10:02:00? ? ? ?3b? ? ? ? ? ? ? ?[2, 3a]

4 2020-01-01 10:30:00? ? ? ? 4? ? ? ? ? ? ? ? ? ? []

5 2020-01-01 10:50:00? ? ? ? 5? ? ? ? ? ? ? ? ? ? []

6 2020-01-01 10:54:00? ? ? ? 6? ? ? ? ? ? ? ? ? ?[7]

7 2020-01-01 10:55:00? ? ? ? 7? ? ? ? ? ? ? ? ? ?[6]


查看完整回答
反對 回復 2023-09-12
  • 1 回答
  • 0 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號