如何为DataFrame补全月份列缺失月份并将无数据月份值填充为0
Pandas补全缺失月份并填充0的实现方案
核心逻辑是先生成目标时段内的完整连续月份基准表,再和原数据做左连接,将无匹配数据的月份统计值填充为0。
步骤1:预处理原表日期字段
你原表已经有数字格式的year和month列,直接拼接成每月第一天的标准日期格式,方便后续计算时间范围:
import pandas as pd # 生成标准日期列,统一取每月第一天 df['date'] = pd.to_datetime(dict(year=df['year'], month=df['month'], day=1))
步骤2:生成全时段连续月份基准表
用pd.date_range生成指定范围内按月频率的日期序列,再拆分出年、月字段,和原表字段对齐:
# 方式1:手动指定你需要的时间范围:2015年7月到2022年5月,freq='MS'代表取每月第一天 full_date = pd.date_range(start='2015-07-01', end='2022-05-01', freq='MS') # 方式2:自动取原表的最早、最晚月份作为范围,不需要硬编码日期 # full_date = pd.date_range(start=df['date'].min(), end=df['date'].max(), freq='MS') # 构建完整月份的基准DataFrame full_month_df = pd.DataFrame({'date': full_date}) full_month_df['year'] = full_month_df['date'].dt.year full_month_df['month'] = full_month_df['date'].dt.month # 若需要还原原表格式的法语缩写yearmonth列,加这段映射即可,不需要可跳过 fr_month_map = {1:'jan',2:'fev',3:'mar',4:'avr',5:'mai',6:'jun',7:'jui',8:'aou',9:'sep',10:'oct',11:'nov',12:'dec'} full_month_df['yearmonth'] = full_month_df['year'].astype(str) + ' ' + full_month_df['month'].map(fr_month_map)
步骤3:关联原表并填充缺失值
以完整月份表为左表做左连接,匹配原表的统计值n,匹配不到的缺失值统一填0:
# 如果原表存在同一年月多条记录的情况,先聚合再关联 # df = df.groupby(['year','month'], as_index=False)['n'].sum() # 关联数据 result = full_month_df.merge(df[['year','month','n']], on=['year','month'], how='left') # 缺失的n值填充为0,转成整数格式 result['n'] = result['n'].fillna(0).astype(int) # 删掉中间用的date列即可得到最终结果 result = result.drop(columns=['date'])
注意:如果原表除了
n之外还有其他需要补全的统计列,把列名加到merge的字段列表中,统一对统计列做fillna(0)即可。
内容的提问来源于stack exchange,提问作者isma
相关产品推荐
相关产品推荐

