Python对比DataFrame两列后创建并追加缺失数据行的实现方法
Pandas补全产品日期缺失记录解决方案
实现思路
不用循环遍历,用pandas自带的笛卡尔积+左连接实现,高效且逻辑清晰:
- 先提取所有日期对应的固定属性(周数、星期、Sample值)
- 生成「所有产品 × 所有目标日期」的全量组合
- 关联日期属性和原有订单数据,缺失的销量填充为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
相关产品推荐
相关产品推荐

