如何计算n行的平均值并将答案粘贴到pandas列的后n行?

时间:2018-07-02 17:51:19

标签: python pandas loops moving-average

我有每周销售数据框架

Sales           weekNum 
83                    1 
139                   2 
207                   3 
278                   4 
274                   5 
291                   6 
319                   7 
305                   8 

我想计算前4周的平均值并将其粘贴到第5周到第8周的索引中

我希望我的输出数据集如下所示

Sales   weekNum   4-PreviousWeekAverage
83            1 
139           2 
207           3 
278           4 
274           5          176.75
291           6          176.75
319           7          176.75
305           8          176.75

同样,我还想计算8周的平均值并将其粘贴到5到8的索引中

我尝试了

for i in [4, 8]:
    newColumnName1 = '%s-PreviousWeekAverage' % i
    df[newColumnName1] = np.nan


    for ix in df.index:
        if ix - i >= 0:

            df.loc[ix, newColumnName1] = np.mean(sampledf.loc[ix-i:ix-1,'Sales'])

但是,它返回的移动平均线如下所示

Sales   weekNum 4-PreviousWeekAverage
83           1  
139          2  
207          3  
278          4  
274          5            176.75
291          6            224.5
319          7            262.5
305          8            290.5

我在循环中遇到问题,无法找出正确的脚本。因此,将感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

groupby在weekNum,transformmean中。

df.groupby((df.weekNum - 1) // 4).Sales.transform('mean').shift(4)

0       NaN
1       NaN
2       NaN
3       NaN
4    176.75
5    176.75
6    176.75
7    176.75
Name: Sales, dtype: float64

答案 1 :(得分:3)

IIUC

df.at[4:,'4-PreviousWeekAverage']=df.Sales.iloc[:4].mean()
df
Out[344]: 
   Sales  weekNum  4-PreviousWeekAverage
0     83        1                    NaN
1    139        2                    NaN
2    207        3                    NaN
3    278        4                    NaN
4    274        5                 176.75
5    291        6                 176.75
6    319        7                 176.75
7    305        8                 176.75