pandas按分组循环填充2019年月度日期列的简便实现方法
Pandas 分组匹配循环月度日期实现方案
问题背景
- 目标DataFrame按
state(州)、district(区县)维度分组,每组固定包含12条月度观测记录 - 需求:新增日期列,每个州-区县组合按顺序匹配2019年1月到12月的月初日期,即从
2019-01-01到2019-12-01按月循环 - 此前执行以下代码生成日期时触发报错:
pd.date_range(start='2019-01-01', end='2020-01-01', freq='M')
报错信息如下:
Length of values (12) does not match length of index (6876)
- 报错原因:单次生成的日期序列长度仅为12,和DataFrame总计6876行的索引长度不匹配
- 约束:不接受拆分小DataFrame逐组左连接日期的实现方式,需要简洁命令
实现代码
注意原代码中freq='M'生成的是每月月末日期,要获取月初日期需要使用频率参数freq='MS'(Month Start),完整实现仅需两行核心代码:
# 生成2019年12个月初日期的基准序列 base_dates = pd.date_range(start='2019-01-01', end='2019-12-01', freq='MS') # 分组生成组内序号,直接映射对应日期赋值为新列 df['date'] = df.groupby(['state', 'district']).cumcount().map(base_dates)
逻辑说明
groupby(['state', 'district']).cumcount()会为每个州-区县分组内的行按现有顺序生成从0到11的连续序号,和每组12条记录的结构完全对应- 通过序号直接映射长度为12的基准日期序列,自动为每个分组按顺序匹配1-12月的对应日期,全表长度自动对齐,不会出现长度不匹配问题
- 无需拆分DataFrame、无需逐组拼接,执行效率高,代码简洁
内容的提问来源于stack exchange,提问作者Vivaan Gupta
相关产品推荐
相关产品推荐

