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

Python对比DataFrame两列后创建并追加缺失数据行的实现方法

Pandas补全产品日期缺失记录解决方案

实现思路

不用循环遍历,用pandas自带的笛卡尔积+左连接实现,高效且逻辑清晰:

  1. 先提取所有日期对应的固定属性(周数、星期、Sample值)
  2. 生成「所有产品 × 所有目标日期」的全量组合
  3. 关联日期属性和原有订单数据,缺失的销量填充为0

完整实现代码

import pandas as pd

# 1. 定义目标日期列表
target_dates = [
    '2021-08-31', '2021-09-02', '2021-09-07', '2021-09-09', '2021-09-14',
    '2021-09-16', '2021-09-21', '2021-09-23', '2021-09-28', '2021-09-30',
    '2021-10-05', '2021-10-07', '2021-10-12', '2021-10-14', '2021-10-19',
    '2021-10-21', '2021-10-26'
]

# 2. 提取日期和对应属性的映射表(去重避免冗余)
date_attr = df[['Date', 'Week', 'Sample', 'Day']].drop_duplicates().reset_index(drop=True)

# 3. 生成全量的产品+日期组合
all_products = df['Product_and_Size'].unique()
full_combine = pd.MultiIndex.from_product(
    [all_products, target_dates],
    names=['Product_and_Size', 'Date']
).to_frame(index=False)

# 4. 关联日期属性
full_combine = full_combine.merge(date_attr, on='Date', how='left')

# 5. 关联原有订单数据,缺失的Amount填充为0
result = full_combine.merge(
    df[['Product_and_Size', 'Date', 'Amount']],
    on=['Product_and_Size', 'Date'],
    how='left'
).fillna({'Amount': 0})

# 按需调整Amount为整数类型
result['Amount'] = result['Amount'].astype(int)

说明

  • 如果有目标日期不在原有数据的日期范围内,导致Week/Sample/Day字段为空,手动补充date_attr表的对应记录即可
  • 原代码报错的原因是直接用整列和长度不同的unique日期数组做比较,维度不匹配,同时循环遍历DataFrame的效率远低于上述向量化操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:54:07