如何在Pandas中按分组为多列计算7日滚动平均值?
Pandas按分组计算多列7日滚动平均值
我有一个包含多列的Pandas数据集,结构如下:
code country_region date retail transit work res CA Canada 2020-02-15 4 3 1 0 CA Canada 2020-02-16 13 4 0 -2 CA Canada 2020-02-17 -12 -28 -52 11 CA Canada 2020-02-18 -1 -1 -1 1 CA Canada 2020-02-19 1 0 0 0 CA Canada 2020-02-20 6 -1 1 0 CA Canada 2020-02-21 2 -1 -3 1 CA Canada 2020-02-22 8 6 6 -1 CA Canada 2020-02-23 7 -5 5 6 ... US United States 2020-02-15 6 3 1 0 US United States 2020-02-16 13 4 0 -2 ...
需求是:按code和country_region分组,为每个分组内的retail、transit、work、res数值列计算7日滚动平均值(已确认数据无缺失日期)。由于数据量极大,不能用Excel的方式处理,需要非循环的Python实现。
目前已将日期列转换为日期类型,代码如下:
df['date_fmt'] = pd.to_datetime(df['date']).apply(lambda t: datetime.datetime.fromisoformat(str(t)))
优化日期转换代码
pd.to_datetime()已经会返回Pandas的datetime对象,无需额外用datetime.datetime.fromisoformat()转换,简化代码:
df['date_fmt'] = pd.to_datetime(df['date'])
核心实现:分组+滚动平均
利用groupby()结合rolling()可以高效完成需求,无需循环。由于数据无缺失日期,每个分组内的日期是连续的,直接指定窗口大小为7即可:
# 定义需要计算滚动平均的数值列 numeric_cols = ['retail', 'transit', 'work', 'res'] # 按code和country_region分组,对指定列计算7日滚动平均 rolling_df = df.groupby(['code', 'country_region'])[numeric_cols].rolling(window=7, min_periods=1).mean().reset_index() # 重命名滚动平均列,方便区分原始列 rolling_df.columns = ['code', 'country_region', 'level_2'] + [f'{col}_7d_avg' for col in numeric_cols] # 合并回原始数据集(可选,根据需求决定) final_df = df.merge(rolling_df.drop('level_2', axis=1), on=['code', 'country_region'])
参数说明:
window=7:因为数据是每日连续无缺失的,窗口大小设为7代表最近7天(含当前行)min_periods=1:允许窗口不足7行时计算平均值(比如前6行会用现有数据计算平均);如果要求必须满7天才能计算,可去掉该参数(默认min_periods=window)reset_index():将分组后的多层索引展开,方便后续合并或单独使用
内容的提问来源于stack exchange,提问作者C. Cooney
相关产品推荐
相关产品推荐

