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

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

Python - 在 Pandas 中平均重采樣的最佳方法

Python - 在 Pandas 中平均重采樣的最佳方法

九州編程 2023-07-27 10:37:13
我有一個數據框。這是一個非常有限的例子。userID    scoreMetric    timeStamp    123       5              2020-05-16 22:03:19313       1              2020-05-16 22:03:20123       4              2020-05-16 22:13:20313       2              2020-05-16 22:13:20123       2              2020-05-16 22:32:20555       5              2020-05-16 22:32:20123       2              2020-05-16 22:32:56這是測試代碼import pandas as pdfrom datetime import datetimedata = { 'userID': [123, 313, 123, 313, 123, 555, 123], 'scoreMetric': [5,1,4,2,2,5,2], 'timeStamp': ['2020-05-16 22:03:19', '2020-05-16 22:03:20', '2020-05-16 22:13:20', '2020-05-16 22:13:20', '2020-05-16 22:32:20', '2020-05-16 22:32:20', '2020-05-16 22:32:56'] }df = pd.DataFrame( data, columns=['userID', 'scoreMetric', 'timeStamp'])df.timeStamp = list( map( lambda x: datetime.strftime( datetime.strptime( x, '%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S' ), df.timeStamp ) )df.timeStamp = pd.to_datetime( df.timeStamp )我想要的是每個用戶的平均值除以一個時間段內的用戶數量。讓我們以 22:00:01-22:30:00 作為我們的時間段。我們這里有 2 個用戶 (123, 313),每個用戶都有兩個時間戳。所以我想要 [ (5+4)/2 + (1+2)/2 ] / 2 = [ 4.5 + 1.5 ] / = 3 作為我的返回值?,F在我們取 22:30:01 到 23:00:00。我們這里又有 2 個用戶 (123, 555),其時間戳可變。所以我想要 [ (2+2)/2 + (5)/1 ] / 2 = [ 2 + 5 ] / 2 = 3.5我認為應該有一種有效的方法通過重采樣來做到這一點。例如,當我只計算平均值時我可以做df.set_index('timeStamp').scoreMetric.resample('30M').mean().fillna(0)然后給出 30 分鐘內所有得分指標的平均值。我已經嘗試了一些方法,但似乎沒有什么可以解決采樣問題,然后首先在每個用戶的基礎上進行計算。有沒有方便的方法可以像這樣簡單的聲明來做到這一點?我是否需要手動將時間序列分塊,然后分段進行平均值等?
查看完整描述

2 回答

?
隔江千里

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

IIUC,用于pd.Grouper按 30 分鐘分組并userID獲取每個 ID 的平均值,另一個groupby按時間僅獲取每次平均值:


print (df.groupby([pd.Grouper(key="timeStamp", freq="1800s"), "userID"])

         .mean()["scoreMetric"].groupby(level=0).mean())


timeStamp

2020-05-16 22:00:00    3.0

2020-05-16 22:30:00    3.5


查看完整回答
反對 回復 2023-07-27
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

如果我理解正確的話,您可以執行以下操作:

import numpy as np
df.set_index('timeStamp',inplace=True)

在這里您可以過濾日期:

data=df[(df.index > '2020-05-16 22:00:01') & (df.index  < '2020-05-16 22:30:00 ')]

進而:

data.groupby('userID')['scoreMetric'].mean().mean()

輸出:

3


查看完整回答
反對 回復 2023-07-27
  • 2 回答
  • 0 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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