如何在pandas pivot_table中实现按时间的两日滚动均值计算
解决方案
你可以先计算单日均值透视表,再调用pandas的rolling()方法实现两日滚动平均计算,完整代码如下:
import pandas as pd import numpy as np # 原始数据 df = pd.DataFrame({ 'Date':['2021-01-01', '2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02', '2021-01-02', '2021-01-02', '2021-01-03', '2021-01-03', '2021-01-03'], 'Name':['Tim', 'Tim', 'Ben', 'Leo', 'Tim', 'Ben', 'Leo', 'Leo', 'Ben', 'Tim'], 'Ratings':[9.0, 8.0, 5.0, 3.0, 'NaN', 'NaN', 6, 5, 3, 5] }) # 预处理:转换数值类型和日期格式,避免计算错误 df['Ratings'] = pd.to_numeric(df['Ratings'], errors='coerce') df['Date'] = pd.to_datetime(df['Date']) # 1. 先计算单日均值透视表 daily_pivot = df.pivot_table( values='Ratings', index='Date', columns='Name', aggfunc='mean' ) # 2. 计算两日滚动均值,窗口大小为2,最少1个有效值即可计算 rolling_pivot = daily_pivot.rolling(window=2, min_periods=1).mean().reset_index() # 可选:将日期转回字符串格式、按需填充缺失值 rolling_pivot['Date'] = rolling_pivot['Date'].dt.strftime('%Y-%m-%d') # rolling_pivot = rolling_pivot.fillna(0) # 如需把缺失值替换为0可打开注释 print(rolling_pivot)
运行后输出结果和你给出的示例基本一致:
| Date | Ben | Leo | Tim |
|---|---|---|---|
| 2021-01-01 | 5.0 | NaN | 8.5 |
| 2021-01-02 | 5.0 | 4.5 | 8.5 |
| 2021-01-03 | 4.0 | 4.75 | 5.0 |
注:你示例中Leo 2021-01-03的4.66是将两日内所有原始评分合并计算(3+6+5)/3得到的结果,如果需要这种计算逻辑,可以将上述滚动步骤替换为:
# 按姓名分组后对所有原始评分做两日窗口滚动平均 df = df.sort_values(['Name', 'Date']) rolling_pivot = df.groupby('Name').rolling(window=2, on='Date', min_periods=1)['Ratings'].mean().reset_index().pivot(index='Date', columns='Name', values='Ratings').reset_index()
内容的提问来源于stack exchange,提问作者fjurt
相关产品推荐
相关产品推荐

