如何使用Pandas与groupby计算特定条件下指定时间段的列滚动均值
这是同类问题的变体,仅新增了Track列:
| Date | Jockey ID | Position | Track |
|---|---|---|---|
| 23-12-2018 | 4340 | 1 | Sha Tin |
| 25-11-2018 | 4340 | 5 | Sha Tin |
| 19-12-2018 | 4340 | 10 | Happy Valley |
| 01-01-2019 | 4340 | 3 | Happy Valley |
| 18-10-2017 | 8443 | 1 | Sha Tin |
| 18-02-2018 | 8443 | 6 | Sha Tin |
| 12-05-2018 | 8443 | 7 | Happy Valley |
需求为:按Jockey ID分组,计算过去1000天内骑手仅在Sha Tin赛道的最终名次Position的滚动均值,非Sha Tin赛道对应的均值字段留空,预期输出结果如下:
| Date | Jockey ID | Position | Track | Mean Position |
|---|---|---|---|---|
| 23-12-2018 | 4340 | 1 | Sha Tin | 1 (1/1) |
| 25-11-2018 | 4340 | 5 | Sha Tin | 3 (1+5)/2 |
| 19-12-2018 | 4340 | 10 | Happy Valley | |
| 01-01-2019 | 4340 | 3 | Happy Valley | |
| 18-10-2017 | 8443 | 1 | Sha Tin | 1 (1/1) |
| 18-02-2018 | 8443 | 6 | Sha Tin | 3.5 (1+6)/2 |
| 12-05-2018 | 8443 | 7 | Happy Valley |
解决方案
你可以通过pandas的时间窗口滚动计算实现该需求,示例代码如下:
import pandas as pd # 假设原始数据存储在df变量中 # 1. 日期格式转换+按时间升序排序 df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y') df = df.sort_values('Date').reset_index(drop=True) # 2. 仅对Sha Tin赛道的记录做分组滚动均值计算 sha_tin_filter = df['Track'] == 'Sha Tin' df.loc[sha_tin_filter, 'Mean Position'] = ( df[sha_tin_filter] .groupby('Jockey ID') .rolling('1000D', on='Date')['Position'] .mean() .reset_index(drop=True) ) # 3. 非Sha Tin赛道的均值字段留空 df['Mean Position'] = df['Mean Position'].fillna('') # 若需要输出示例中带计算过程的字符串格式,可额外按分组聚合历史位置信息做字符串拼接即可
内容的提问来源于stack exchange,提问作者Bogdan Doicin
相关产品推荐
相关产品推荐

