我正在尋找一種有效的方法來創建“average_units”列 - 對于 Col B 中的每個組,該列逐行計算前 4 天的平均單位,同時排除 0 個單位天。下面的簡單示例:
原DF
ColA ColB Units
2021-01-01 A 2
2021-01-02 A 0
2021-01-03 A 4
2021-01-04 A 8
2021-01-05 A 1
2021-01-06 A 0
2021-01-07 A 0
2021-01-08 A 7
2021-01-01 B 3
2021-01-02 B 6
2021-01-03 B 9
2021-01-04 B 0
2021-01-05 B 1
2021-01-06 B 7
2021-01-07 B 0
2021-01-08 B 5
所需的 DF...“平均單位”計算示例:2021 年 1 月 8 日在 A 組中...計算將查看前4 天的單位 (0,0,1,8)...并將計算排除 0 的平均值 - 因此 1 8 / 2 = 4.5
ColA ColB Units Avg Units
2021-01-01 A 2 NA
2021-01-02 A 0 NA
2021-01-03 A 4 NA
2021-01-04 A 8 NA
2021-01-05 A 1 7
2021-01-06 A 0 6.5
2021-01-07 A 0 6.5
2021-01-08 A 7 4.5
2021-01-01 B 3 NA
2021-01-02 B 6 NA
2021-01-03 B 9 NA
2021-01-04 B 0 NA
2021-01-05 B 1 9
2021-01-06 B 7 8
2021-01-07 B 0 8.5
2021-01-08 B 5 4
我知道這可以通過一些回圈來完成,但這會非常復雜且耗時,因為我有 1000 個組和更多日期。任何建議表示贊賞!
uj5u.com熱心網友回復:
import numpy as np
def rolling_average_custom(group):
group_parsed = group.iloc[0:4].replace(0, np.nan)
return group_parsed.mean()
tmp.groupby('ColB').rolling(min_periods=5, window=5).apply(rolling_average_custom)
回傳
Units
ColB
A 0 NaN
1 NaN
2 NaN
3 NaN
4 4.666667
5 4.333333
6 4.333333
7 4.500000
B 8 NaN
9 NaN
10 NaN
11 NaN
12 6.000000
13 5.333333
14 5.666667
15 4.000000
我認為您的示例中有一些錯誤。就像第一個值不應該是 7,而是 (8 4 2)/3。如果是這種情況,解決方案應該有效。
要添加到資料框:
rolling_output = tmp.groupby('ColB').rolling(min_periods=5, window=5).apply(rolling_average_custom)
tmp = tmp.set_index(['ColB'], append=True)
tmp = tmp.swaplevel()
tmp['average'] = rolling_output
結果:
ColA Units average
ColB
A 0 2021-01-01 2 NaN
1 2021-01-02 0 NaN
2 2021-01-03 4 NaN
3 2021-01-04 8 NaN
4 2021-01-05 1 4.666667
5 2021-01-06 0 4.333333
6 2021-01-07 0 4.333333
7 2021-01-08 7 4.500000
B 8 2021-01-01 3 NaN
9 2021-01-02 6 NaN
10 2021-01-03 9 NaN
11 2021-01-04 0 NaN
12 2021-01-05 1 6.000000
13 2021-01-06 7 5.333333
14 2021-01-07 0 5.666667
15 2021-01-08 5 4.000000
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409479.html
標籤:
