[英]Extrapolating dataframes to calculate 15min and 30min averages
假設我有一個這樣的數據框(時間列有 3 個最小窗口並按 ID-A 和 ID-B 分組)-
ID-A ID-B time sum num
A 1 09:30:00 5 2
1 09:33:00 8 2
1 09:36:00 5 2
2 09:36:00 10 3
2 09:39:00 15 3
2 09:42:00 2 3
B 1 09:30:00 10 2
1 09:33:00 12 2
1 09:36:00 5 2
我正在嘗試計算總和除以 num 的 15 分鍾和 30 分鍾平均值。 我的 df- 的可復制版本
import pandas as pd
data = {'time': ['09:30:00',
'09:33:00',
'09:36:00',
'09:36:00',
'09:39:00',
'09:42:00',
'09:30:00',
'09:33:00',
'09:36:00'],
'sum': [5, 8, 5, 10, 15, 2, 10, 12, 5],
'num': ['2', '2', '2', '3', '3', '3', '2', '2', '2']}
my_index = pd.MultiIndex.from_arrays([["A"]*6 + ["B"]*3, [1, 1, 1, 2, 2, 2, 1, 1, 1]], names=["ID-A", "ID-B"])
df = pd.DataFrame(data, index=my_index)
注意:- 對於 1 對 ID-A 和 ID-B,數字始終相同。
所需數據幀(按 ID-A 和 ID-B 分組)-
ID-A ID-B time sum num 15min 30min
A 1 09:30:00 5 2 15 30
09:33:00 8 2 15 30
09:36:00 5 2 15 30
2 09:36:00 10 3 15 30
09:39:00 15 3 15 30
09:42:00 2 3 15 30
B 1 09:30:00 10 2 22.5 45
09:33:00 12 2 22.5 45
09:36:00 5 2 22.5 45
例如 - 對於 ID-A -> A 和 ID-B -> 1,總時間數據僅可用 9 分鍾。 所以我做了,(5+8+5)/9 = 18/9 = 2 1 分鍾。 它還必須除以 num,所以 2/2=1。 因此,對於 15 分鍾,將是 15 和 30 為 30 分鍾。 可能存在時間數據可用 15 或 30 分鍾的情況。 顯然,不需要外推,只需要進行正常計算。
我的方法 - 因為我需要的最大平均值是 30 分鍾,所以我想先將所有值外推到 30 分鍾,這樣我就不必關心是否存在所有值。 最終我只想要我的 df 中的 ID-A、ID-B、15min 和 30min 列,但這也可以。
看起來這行得通?
# cast 'num' to float
df['num'] = df['num'].astype(float)
def add_cols(grp):
# divide sum by 3xnum of rows, and then divide by 'num'
multiple = grp['sum'].sum() / (3*len(grp)) / grp.iloc[0, -1]
return grp.assign(**{'15min': 15 * multiple, '30min': 30 * multiple})
df.groupby(['ID-A', 'ID-B']).apply(add_cols)
Output:
time sum num 15min 30min
ID-A ID-B
A 1 2022-09-18 09:30:00 5 2.0 15.0 30.0
1 2022-09-18 09:33:00 8 2.0 15.0 30.0
1 2022-09-18 09:36:00 5 2.0 15.0 30.0
2 2022-09-18 09:36:00 10 3.0 15.0 30.0
2 2022-09-18 09:39:00 15 3.0 15.0 30.0
2 2022-09-18 09:42:00 2 3.0 15.0 30.0
B 1 2022-09-18 09:30:00 10 2.0 22.5 45.0
1 2022-09-18 09:33:00 12 2.0 22.5 45.0
1 2022-09-18 09:36:00 5 2.0 22.5 45.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.