我有以下熊貓資料框df:
| 時間戳 | 版本 | 實際的 | 預測 |
|---|---|---|---|
| 2022-01-19 11:00:00.600 | 1 | 0 | 0 |
| 2022-01-19 11:00:00.800 | 1 | 0 | 1 |
| 2022-01-19 11:00:01.200 | 1 | 1 | 0 |
| 2022-01-19 11:00:01.800 | 1 | 0 | 0 |
| 2022-01-19 11:00:02.200 | 2 | 1 | 1 |
| 2022-01-19 11:00:02.600 | 2 | 0 | 0 |
| 2022-01-19 11:00:03.200 | 3 | 0 | 1 |
| 2022-01-19 11:00:03.600 | 3 | 0 | 0 |
| 2022-01-19 11:00:03.800 | 3 | 1 | 0 |
| 2022-01-19 11:00:03.600 | 4 | 0 | 0 |
| 2022-01-19 11:00:03.800 | 4 | 0 | 1 |
我需要計算1inactual和的值之間的總距離(以毫秒為單位) pred,按 分組version。
預期的答案是:1000 毫秒
- 版本 1:(2022-01-19 11:00:01.200 - 2022-01-19 11:00:00.600)= 400 毫秒
- 版本 2:(2022-01-19 11:00:02.200 - 2022-01-19 11:00:02.200)= 0 毫秒
- 版本 3:(2022-01-19 11:00:03.800 - 2022-01-19 11:00:03.200)= 600 毫秒
uj5u.com熱心網友回復:
假設每個“版本”存在一個“實際”和一個“預測”值,我們可以簡單地減去值。換句話說,如果每個“版本”恰好有 1 個“實際”值和 1 個“預測”值,那么df['actual'].eq(1)每個“版本”恰好有一個值將是 True;對于df['pred'].eq(1). 由于資料按“版本”排序,因此版本匹配。
df['timestamp'] = pd.to_datetime(df['timestamp'])
out = ((df.loc[df['actual'].eq(1), 'timestamp'].to_numpy() -
df.loc[df['pred'].eq(1), 'timestamp'].to_numpy())
.astype('timedelta64[ms]').sum())
如果不是所有版本的 "actual" 或 "pred" 都為 1,我們仍然可以過濾 "actual" 和 "pred" 值;然后在“版本”上合并(這樣每個“版本”都會有一個“實際”和一個“預測”值);然后找到差異和sum:
df['timestamp'] = pd.to_datetime(df['timestamp'])
merged = (df.loc[df['actual'].eq(1), ['version', 'timestamp']]
.merge(df.loc[df['pred'].eq(1), ['version', 'timestamp']],
on='version', suffixes=('_actual', '_pred')))
out = (merged['timestamp_actual'] - merged['timestamp_pred']).astype('timedelta64[ms]').sum()
輸出:
1000
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446259.html
