【问题标题】:Optimal way to take mean of Series取系列平均值的最佳方法
【发布时间】:2022-01-20 05:51:46
【问题描述】:
对于由 DateTime 索引组织的 DataFrame,对其中的列进行连续滚动均值的最佳方法是什么?
例如:
2021-12-20 09:30:00 6.0
2021-12-20 09:31:00 36.0
2021-12-20 09:32:00 37.0
2021-12-20 09:33:00 41.0
2021-12-20 09:34:00 73.0
我的目标是创建一个新列,其中第一个值是第一行的平均值 (6),第二行是前两行的平均值,依此类推。这可以通过 Pandas 实现,还是我必须遍历整个 DataFrame?另外,是否可以在每天 9:30:00 将此列重置为第一卷?
【问题讨论】:
标签:
python
pandas
dataframe
【解决方案1】:
将DataFrame.expanding 与mean 一起使用:
df['A'].expanding().mean()
以09:30 开头的每个组都可以创建助手组:
import datetime
g = np.cumsum(df.index.time == datetime.time(9, 30))
df.groupby(g)['A'].expanding().mean()
print (df)
A
2021-12-20 09:30:00 6.0
2021-12-20 09:31:00 36.0
2021-12-20 09:32:00 37.0
2021-12-20 09:33:00 41.0
2021-12-20 09:34:00 73.0
2021-12-21 09:30:00 6.0
2021-12-21 09:31:00 36.0
2021-12-21 09:32:00 37.0
2021-12-21 09:33:00 41.0
2021-12-21 09:34:00 73.0
import datetime
g = np.cumsum(df.index.time == datetime.time(9, 30))
df['rolling mean'] = df['A'].expanding().mean()
df['reset'] = df.groupby(g)['A'].expanding().mean().droplevel(0)
print (df)
A rolling mean reset
2021-12-20 09:30:00 6.0 6.000000 6.000000
2021-12-20 09:31:00 36.0 21.000000 21.000000
2021-12-20 09:32:00 37.0 26.333333 26.333333
2021-12-20 09:33:00 41.0 30.000000 30.000000
2021-12-20 09:34:00 73.0 38.600000 38.600000
2021-12-21 09:30:00 6.0 33.166667 6.000000
2021-12-21 09:31:00 36.0 33.571429 21.000000
2021-12-21 09:32:00 37.0 34.000000 26.333333
2021-12-21 09:33:00 41.0 34.777778 30.000000
2021-12-21 09:34:00 73.0 38.600000 38.600000