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

Pandas:补全DataFrame中缺失的月份记录

解决方法:补全邮政编码缺失月份的累计购买量记录

Got it, let's work through this problem to fill in those missing monthly entries for each zipcode by carrying forward the last known cumulative purchase value. Here's a step-by-step approach using pandas:


1. 准备工作:转换日期格式

首先,我们需要把Date列转换成datetime类型,这样才能方便生成连续的时间序列。原数据的日期格式是"Month Year"(比如December 2018),所以用pd.to_datetime配合format='%B %Y'来解析:

import pandas as pd

# 你的示例数据
data = {
    'Zipcode': ['9999', '9999', '9999', '9999', '9999', '2400', '2400', '2400'],
    'Date': ['December 2018', 'January 2019', 'February 2019', 'March 2019', 'April 2019',
             'December 2018', 'January 2019', 'February 2019'],
    'Cumulative purchases': [2, 2, 2, 3, 4, 2, 3, 4]
}
df = pd.DataFrame(data)

# 转换日期为datetime类型
df['Date'] = pd.to_datetime(df['Date'], format='%B %Y')

2. 分组补全缺失月份

接下来,我们按Zipcode分组,为每个组生成完整的月份序列,然后用**向前填充(forward fill)**来补全缺失的累计购买量:

def process_zipcode_group(group):
    # 生成当前zipcode下从最早到最晚日期的所有月份(用'M'表示每月最后一天,保证和原数据时间对齐)
    full_month_range = pd.date_range(start=group['Date'].min(), end=group['Date'].max(), freq='M')
    # 重新索引到完整月份,并用上一个非缺失值填充空缺
    filled_group = group.set_index('Date').reindex(full_month_range).ffill()
    # 恢复Date列为普通列,重置索引
    filled_group = filled_group.reset_index().rename(columns={'index': 'Date'})
    return filled_group

# 对每个zipcode应用处理函数
filled_df = df.groupby('Zipcode', group_keys=False).apply(process_zipcode_group)

3. 恢复原日期格式

最后,把datetime类型的Date列转回你需要的"Month Year"字符串格式:

filled_df['Date'] = filled_df['Date'].dt.strftime('%B %Y')
# 重置行索引,让结果更整洁
filled_df = filled_df.reset_index(drop=True)

最终结果

运行完上面的代码后,filled_df就会包含每个zipcode的完整月份记录,缺失的月份会用上一个月的累计购买量填充,和你想要的输出完全一致:

ZipcodeDateCumulative purchases
09999December 20182
19999January 20192
29999February 20192
39999March 20193
49999April 20194
52400December 20182
62400January 20193
72400February 20194
82400March 20194
92400April 20194

关键细节说明

  • pd.date_range的freq参数:用'M'会生成每月最后一天,和原数据的“Month Year”语义匹配;如果需要月初,换成'MS'即可,不影响补全逻辑。
  • ffill():专门用来向前填充缺失值,正好符合你“重复上一个月累计值”的需求。
  • 分组处理:确保每个zipcode独立计算自己的日期范围,不会和其他zipcode的日期混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:14:08