【发布时间】:2020-11-24 12:38:41
【问题描述】:
我有一个这样的df:
date car model mpg
1 ford focus 10
1 ford fiesta 15
1 ford mustang 20
2 ford focus 13
2 ford fiesta 16
2 ford mustang 27
3 ford focus 13
3 ford mustang 27
4 ford focus 12
4 ford fiesta 17
我想为每组date, car, model 添加一个window = 2 和date 的列rolling_mean,这样我就有一个像这样的df:
date car model mpg rolling_avg
1 ford focus 10 nan
1 ford fiesta 15 nan
1 ford mustang 20 nan
2 ford focus 13 11.5
2 ford fiesta 16 15.5
2 ford mustang 27 23.5
3 ford focus 13 13
3 ford mustang 27 27
4 ford focus 12 12.5
4 ford fiesta 17 Because fiesta is not in date=3, I want to (17+0)/2 = 8.5
我尝试了什么:
df_test.groupby(['date','car','model'])[['mpg']].rolling(window=2).mean().reset_index()
date car model level_3 mpg
0 1 ford fiesta 1 NaN
1 1 ford focus 0 NaN
2 1 ford mustang 2 NaN
3 2 ford fiesta 4 NaN
4 2 ford focus 3 NaN
5 2 ford mustang 5 NaN
6 3 ford focus 6 NaN
7 3 ford mustang 7 NaN
8 4 ford fiesta 9 NaN
9 4 ford focus 8 NaN
不确定level_3 代表什么。在尝试实现我想要的结构时,我的错误在哪里?
这是使用的数据:
df = pd.DataFrame({'date':[1,1,1,2,2,2,3,3,4,4],
'car':['ford','ford','ford','ford','ford','ford','ford','ford','ford','ford'],
'model':['focus','fiesta','mustang','focus','fiesta','mustang','focus','mustang','focus','fiesta'],
'mpg':[10,15,20,13,16,27,13,27,12,17]})
【问题讨论】:
-
不要按日期分组。每个日期您只有一个模型。所以你只能得到大小为 1 的组。只需使用
df.groupby(['car','model'])[['mpg']].rolling(window=2).mean().reset_index() -
问题不在于您按日期、汽车和型号对DataFrame进行分组,而它只应按汽车和型号分组?通过按日期、汽车和型号对其进行分组,每一行本身就是一个组,这就是您收到 NaN 值的原因。
-
这是有道理的,但是,我希望
date存在,以便我可以按日期绘制滚动平均值如何变化的图表。