我正在尝试计算以下数据集 4 天的滚动平均值。结果还应根据其他 2 列的组进行计算。
例如:
df_time = pd.DataFrame({'A': [123, 123, 278, 278, 278, 123, 345, 278, 123,278, 278],
'B': [1, 2, 2, 2, 2, 1, 3, 2, 1, 2, 2],
'C': [0, 4, 2, 0, 4, 5, 3, 2, 1, 3, 2],
'D' : [pd.Timestamp('20130101'),
pd.Timestamp('20130102'),
pd.Timestamp('20130101'),
pd.Timestamp('20130102'),
pd.Timestamp('20130103'),
pd.Timestamp('20130103'),
pd.Timestamp('20130104'),
pd.Timestamp('20130104'),
pd.Timestamp('20130105'),
pd.Timestamp('20130106'),
pd.Timestamp('20130109')],
'rol_avg': [0, 2, 2, 1, 2, 5, 3, 3, 3, 2, 2.5] } )
df_time.sort_values(by='D')
sum_df = df_time.groupby(by=['A', 'B', 'D'])['C'].sum()
rolling_average_series = sum_df.groupby(level=[0, 1]).rolling(4, min_periods=1).mean()
返回
它正在查找 A 列和 B 列过去 4 次出现的滚动平均值。但我需要的是相对于日期列“D”并按列“A”和“B”分组的 4 天的滚动平均值
这里,对于 09-01-2013 的 A=278 和 B=2,我们只有 06-01-2013,它属于 4 天滚动平均值,因此平均值应为 (2+3)/2 = 2.5 我如何实现这个功能? 非常感谢任何帮助
最佳答案
我希望我已经很好地理解了你的问题。您可以在 .rolling()
中使用 on=
指定列,然后指定 window="4D"
- 您想要 4 天的滚动窗口:
df_time = df_time.sort_values(by="D")
sum_df = df_time.groupby(by=["A", "B", "D"], as_index=False)["C"].sum()
rolling_average_series = (
sum_df.groupby(["A", "B"])
.rolling(on="D", window="4D", min_periods=1)
.mean()
)
print(rolling_average_series)
打印:
D C
A B
123 1 0 2013-01-01 0.0
1 2013-01-03 2.5
2 2013-01-05 3.0
2 3 2013-01-02 4.0
278 2 4 2013-01-01 2.0
5 2013-01-02 1.0
6 2013-01-03 2.0
7 2013-01-04 2.0
8 2013-01-06 3.0
9 2013-01-09 2.5
345 3 10 2013-01-04 3.0
关于pandas - 相对于 pandas 中其他 2 列的组,日期列上 4 天的滚动平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72853895/