如何使用Pandas结合groupby计算指定时间周期内列的滚动平均值
实现方法
你可以用pandas的时间滚动窗口功能完成该需求,具体实现步骤如下:
前置准备
首先确保你已经安装了pandas库,且原始数据已经加载为DataFrame格式。
代码实现
import pandas as pd # 1. 转换日期列为datetime类型(必须步骤,时间窗口计算依赖标准日期格式) df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y') # 2. 按骑手ID+日期升序排序,保证每个骑手的记录按时间先后排列 df = df.sort_values(by=['Jockey ID', 'Date']).reset_index(drop=True) # 3. 分组计算1000天内的滚动平均名次 # 参数说明: # '1000D':窗口长度为1000天 # min_periods=1:只要窗口内有至少1条数据就计算,避免前几行出现空值 df['Mean Position'] = df.groupby('Jockey ID')\ .rolling('1000D', on='Date', min_periods=1)['Position']\ .mean()\ .round(2)\ .values # 如果你需要输出和示例完全一致的带计算说明的字符串格式,可以额外加以下代码: g = df.groupby('Jockey ID').rolling('1000D', on='Date', min_periods=1)['Position'] df['mean_val'] = g.mean().round(2).values df['count_val'] = g.count().astype(int).values df['sum_val'] = g.sum().astype(int).values df['Mean Position'] = df.apply(lambda x: f"{x['mean_val']} ({x['sum_val']}/{x['count_val']})", axis=1) # 不需要的中间列可以按需删除:df = df.drop(columns=['mean_val','count_val','sum_val'])
结果说明
运行上述代码后得到的Mean Position列数值和你给出的预期结果完全一致。如果需要调整小数保留位数,修改round()方法的参数即可。
内容的提问来源于stack exchange,提问作者Bogdan Doicin
相关产品推荐
相关产品推荐

