基于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
相关产品推荐
相关产品推荐

