Python检查两个同形状DataFrame是否存在同位置非空重叠单元格
同结构订单DataFrame重叠校验与周度聚合实现
需求与现存问题
- 待处理对象为2个形状、行索引、列名完全一致的DataFrame,单元格存储指定订货日对应配送日的订单量,空值统一填充为
np.nan - 校验规则:任意坐标位置的单元格仅允许在DF1或DF2其中一个存在非空值,若出现同位置双非空的情况需抛出明确异常
- 最终产出:校验通过后聚合得到按周维度统计的周平均订单矩阵
- 原有方案缺陷:
- 直接调用
.notnull()比对两个DataFrame返回的布尔矩阵零散杂乱,无法直观判断是否存在重叠、定位重叠位置 - 双重for循环逐单元格遍历的实现不够Pythonic,大数据量下运行效率低
- 方案需适配大日期范围数据集,全程自动化校验,无需人工介入核对
- 直接调用
完整实现代码
import pandas as pd import numpy as np # 加载源数据 df1 = pd.read_csv('DF1.csv', index_col='order_day') df2 = pd.read_csv('DF2.csv', index_col='order_day') # 前置校验:确认两个DataFrame结构完全匹配 if not (df1.shape == df2.shape and df1.index.equals(df2.index) and df1.columns.equals(df2.columns)): raise ValueError("两个DataFrame的形状/行索引/列名不匹配,无法执行重叠校验") # 核心校验:向量化运算定位非空重叠位置 overlap_mask = df1.notna() & df2.notna() if overlap_mask.any(axis=None): # 提取所有重叠位置的明细信息,方便问题排查 overlap_records = overlap_mask.stack() overlap_positions = overlap_records[overlap_records].index.tolist() detail_msg = [] for order_day, delivery_day in overlap_positions: detail_msg.append( f"订货日{order_day}、配送日{delivery_day}位置:DF1值={df1.loc[order_day, delivery_day]},DF2值={df2.loc[order_day, delivery_day]}" ) raise ValueError(f"检测到同位置单元格重复填充,重叠明细如下:\n" + "\n".join(detail_msg)) print('No filled cells overlap!') # 校验通过后合并数据,计算周度平均订单矩阵 df_combined = df1.combine_first(df2) df_combined.index = pd.to_datetime(df_combined.index) df_weekly_avg = df_combined.resample('W').mean()
实现说明
- 所有校验逻辑基于pandas向量化运算实现,无逐行逐列的显式循环,代码简洁符合Pythonic要求,大日期范围数据集下运行性能优异
- 校验不通过时会直接输出所有重叠位置的坐标和对应两个DataFrame的取值,无需人工排查零散布尔结果
- 无重叠场景下使用
combine_first自动合并两个DataFrame的非空值,无需额外判断空值逻辑
注:如果周度统计需要按自然周起始日对齐(比如以周一为周起始),可以在resample时传入参数
resample('W-MON')适配业务规则
内容的提问来源于stack exchange,提问作者Kars
相关产品推荐
相关产品推荐

