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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:45:33