如何计算 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计算dataframe数据行的均值(mean)实战:设置skipna=False则计算行均值时不会忽略NaN值