我有一個數據框。這是一個非常有限的例子。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

皈依舞
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
添加回答
舉報
0/150
提交
取消