【发布时间】:2020-10-12 10:08:54
【问题描述】:
我有一个 DF:
tbname stat_day count
0 calc_10 2020-05-01 0
1 calc_10 2020-05-02 0
2 calc_10 2020-05-03 0
<snip>
49 calc_10 2020-06-19 361
50 calc_10 2020-06-20 506
51 calc_10 2020-06-21 0
52 calc_10 2020-06-22 0
53 calc_12 2020-05-01 0
54 calc_12 2020-05-02 0
<snip>
73 calc_12 2020-05-21 0
74 calc_12 2020-05-22 0
75 calc_12 2020-05-23 0
<snip>
然后我将它分组并得到一个滚动平均值:
gp=df_tsd.groupby(['tbname'])
df_gp=gp.rolling(30,on='stat_day').mean()
我想保留计数列并添加一个 RMA 列,但是 rolling().mean() 将计数列替换为滚动值:
stat_day count
tbname
calc_10 0 2020-05-01 NaN
1 2020-05-02 NaN
2 2020-05-03 NaN
<snip> 41 2020-06-11 0.000000
42 2020-06-12 249.533333
43 2020-06-13 777.333333
44 2020-06-14 1310.333333
45 2020-06-15 1841.700000
46 2020-06-16 2235.933333
47 2020-06-17 2259.933333
48 2020-06-18 2283.200000
49 2020-06-19 2295.233333
50 2020-06-20 2312.100000
51 2020-06-21 2312.100000
52 2020-06-22 2312.100000
更新: 您的代码有效! (自然),我添加了一些调整:
df_tsd['RDA']=df_tsd.groupby('tbname')['count'].transform(lambda x: x.rolling(7).mean())
print(df_tsd.groupby('tbname').tail(30).round({'RDA':0}).to_string(index=False))
这是输出:
tbname stat_day count RDA
calc_10 2020-05-24 0 0.0
calc_10 2020-05-25 0 0.0
calc_10 2020-05-26 0 0.0
calc_10 2020-05-27 0 0.0
calc_10 2020-05-28 0 0.0
calc_10 2020-05-29 0 0.0
calc_10 2020-05-30 0 0.0
<snip>
calc_10 2020-06-12 7486 1069.0
calc_10 2020-06-13 15834 3331.0
calc_10 2020-06-14 15990 5616.0
calc_10 2020-06-15 15941 7893.0
calc_10 2020-06-16 11827 9583.0
calc_10 2020-06-17 720 9685.0
<snip>
calc_12 2020-06-02 1959 280.0
calc_12 2020-06-03 1582 506.0
calc_12 2020-06-04 0 506.0
我的代码(不太好用)最终没有新的滚动列,但输出很整洁,请注意 tbname 上的控制中断:
stat_day count
tbname
calc_10 23 2020-05-24 0.0
24 2020-05-25 0.0
25 2020-05-26 0.0
26 2020-05-27 0.0
<snip>
calc_12 70 2020-05-18 0.0
71 2020-05-19 0.0
72 2020-05-20 0.0
<snip>
88 2020-06-05 506.0
89 2020-06-06 506.0
【问题讨论】:
标签: pandas dataframe mean rolling-computation