如何为pandas数据框中每个唯一城市单独计算value列的移动平均线
Pandas按城市分组计算单列移动平均实现方案
前置准备
计算前必须先对DataFrame按「城市+日期」做升序排序,保证每个城市的数据是按时间先后排列的,否则移动平均结果会出错:
# 排序并重置索引 df = df.sort_values(by=["city", "date"]).reset_index(drop=True)
核心实现代码
你需要的分组滚动计算逻辑可以直接通过groupby+rolling实现,以下是两种常用写法,效果一致:
写法1:用transform直接对齐原索引
适合快速赋值,不需要额外处理索引:
# 新增ma_3列存储每个城市的3期移动平均值 df["ma_3"] = df.groupby("city")["value"].transform(lambda x: x.rolling(3).mean())
写法2:直接对分组后的值做滚动计算
适合需要自定义滚动参数的场景,计算后重置分组索引即可和原DataFrame对齐:
# min_periods=1表示不足3期时按现有数据计算,避免前2行出现空值 df["ma_3"] = df.groupby("city")["value"].rolling(3, min_periods=1).mean().reset_index(level=0, drop=True)
常用参数说明
- 调整窗口大小:修改
rolling()的第一个参数即可,比如要算7天移动平均就改成rolling(7) - 中心移动平均:需要计算当期前后各n期的平均值时,添加参数
center=True - 缺失值处理:可以先通过
df["value"] = df["value"].fillna(0)填充缺失值后再做滚动计算
结果验证
计算完成后可以单独筛选单个城市的数据做校验,确认移动平均没有混入其他城市的数值:
print(df[df["city"] == "saopaulo"].head())
内容的提问来源于stack exchange,提问作者Marcos Vinícius Petri
相关产品推荐
相关产品推荐

