如何高效比对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
相关产品推荐
相关产品推荐

