You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

运行后输出结果和你给出的示例基本一致:

DateBenLeoTim
2021-01-015.0NaN8.5
2021-01-025.04.58.5
2021-01-034.04.755.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:15:01