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

基于Python为DataFrame各用户自动计算近6个月平均值并新增列

解决方案

步骤1:数据预处理与日期格式转换

首先将year_month转换为可排序的日期类型,确保后续时间序列操作的准确性:

import pandas as pd

# 示例数据(替换为你的实际数据)
df = pd.DataFrame({
    'user_id': [1,1,1,1,2,2,2,2,3,3,3,3],
    'value': [50,54,50,47,36,48.5,54,30.2,41.4,48.5,41.4,30.2],
    'year_month': ['2021-01','2021-02','2021-11','2021-12','2021-01','2021-05','2021-11','2021-12','2021-01','2021-02','2021-05','2021-12']
})

# 转换为月度结束日期,方便补全缺失月份
df['year_month'] = pd.to_datetime(df['year_month']) + pd.offsets.MonthEnd(0)

步骤2:补全用户缺失的月度记录

由于部分用户可能存在月份断档,需补全每个用户的完整月度序列,避免滚动计算时跳过缺失月份:

def fill_missing_months(group):
    # 生成该用户时间范围内的完整月度序列
    full_dates = pd.date_range(start=group['year_month'].min(), end=group['year_month'].max(), freq='M')
    # 重新索引补全缺失月份,缺失的value设为NaN
    return group.set_index('year_month').reindex(full_dates).reset_index().rename(columns={'index': 'year_month'})

# 按用户分组补全数据
df_full = df.groupby('user_id').apply(fill_missing_months).reset_index(drop=True)

步骤3:计算过去6个月平均值

按用户分组后,使用滚动窗口计算当前月份前6个月的平均值(不包含当前月):

# 滚动窗口大小为6,closed='left'表示窗口包含左边界(前第6个月)、不包含右边界(当前月)
df_full['past_6m_avg'] = df_full.groupby('user_id')['value'].rolling(window=6, closed='left').mean().reset_index(drop=True)

# 可选:将日期转回字符串格式
df_full['year_month'] = df_full['year_month'].dt.strftime('%Y-%m')

关键说明

  • 如果希望缺失月份的value按0计算,可在补全步骤后添加df_full['value'] = df_full['value'].fillna(0)。
  • 若数据本身无缺失月份,可跳过步骤2,直接执行步骤3。
  • 滚动窗口的closed参数可根据需求调整:closed='both'会包含当前月,需根据你的实际计算规则修改。

内容的提问来源于stack exchange,提问作者s nandan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:15:33