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

如何高效比对Pandas新旧DataFrame的ETD/ETA差异并生成变更表

解决方案

原嵌套循环方案的时间复杂度为O(n²),数据量稍大就会出现严重卡顿,推荐使用Pandas内置的关联+向量化过滤方案,性能是循环方案的数百倍以上。

核心实现代码

import pandas as pd

# 示例数据
df_old = pd.DataFrame({'ID': [1, 2, 3], 'ETD': ['06.02.2021', '05.01.2021', '07.02.2021'], 'ETA':['06.02.2021', '05.01.2021', '07.02.2021']}, 
                  columns=['ID', 'ETD', 'ETA'])
df_new = pd.DataFrame({'ID': [1, 2, 3], 'ETD': ['07.02.2021', '05.01.2021', '07.02.2021'], 'ETA':['06.02.2021', '05.01.2021', '04.02.2021']}, 
                  columns=['ID', 'ETD', 'ETA'])

# 按ID关联新旧表,后缀区分版本
merged = df_old.merge(df_new, on='ID', how='inner', suffixes=('-last', '-new'))
# 过滤出存在字段差异的行
df_CNG = merged[(merged['ETD-last'] != merged['ETD-new']) | (merged['ETA-last'] != merged['ETA-new'])].reset_index(drop=True)

参数调整说明

  • 关联规则:如果需要保留仅在旧表/新表中存在的ID,将how='inner'改为how='outer'即可,缺失的版本字段会自动填充为NaN
  • 列顺序:可以直接通过列名列表调整输出的列顺序,示例:
df_CNG = df_CNG[['ID', 'ETD-last', 'ETD-new', 'ETA-last', 'ETA-new']]

性能说明

该方案依赖Pandas底层优化的向量化运算,时间复杂度为O(n),十万行级数据运行耗时在毫秒级,完全不会出现Jupyter无响应的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 04:03:03