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

Posted

技术标签:

【中文标题】如何计算 n 行的平均值并将答案粘贴到 pandas 列的下 n 行?【英文标题】:How to compute the average of n rows and paste the answer to next n rows of pandas column? 【发布时间】:2018-12-10 23:42:54 【问题描述】:

我有一个每周销售数据框

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

我在循环时遇到问题,无法找出正确的脚本。因此将不胜感激。

【问题讨论】:

第二个输出到底有什么问题?为什么您的预期输出都具有相同的数字? @coldspeed,问题是我不想要移动平均线。我只想要第一周的平均值 但是你的问题标题说“如何计算移动平均线”。您能否考虑将您的标题更新为更有意义地反映您真正想要的内容? pandas 标签中问题的一个大问题是标题写得不好,因此寻找这些问题的解决方案的人找不到它,因为问题的编写方式。 @coldspeed 我已经改变了我的问题。抱歉,这是无意的,我并不是有意混淆。谢谢 肯定更好,谢谢! 【参考方案1】:

groupby on weekNum 和transform by mean

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

【讨论】:

【参考方案2】:

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

【讨论】:

文,谢谢你的回答,但实际上我的数据集超出了 8 rows ,所以开放索引不能很好地解决我的问题。

以上是关于如何计算 n 行的平均值并将答案粘贴到 pandas 列的下 n 行?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 计算组中前 n 条记录的平均值

用 pandas 计算每个后续组的 2 行的平均值

如何计算行之间的动态平均值?

计算 Pandas 中具有相同列值的行的平均值

pandas计算dataframe数据行的均值(mean)实战:设置skipna=False则计算行均值时不会忽略NaN值

在 Pandas、Python 中查找具有相同第一列的所有行的最小值、最大值、平均值