网上的一个问题,两列发票号比对,‘票据起号’列与‘票据止号’列是票号范围,计数有77688张,‘发票号’列是具体的票号,计数有77686张,要求比对出这两种数据的差异:
可以看出,如果票据起止号列是按序排列的,也好比对,一个vlookup函数就能比对出来两列数据数据的差异,所以本题的关键是将票据起止号处理成正常的发票号,如下:
但处理过后有7万行数据,用公式普遍反映太卡了,试试直接用Python处理,对应的代码为:# 创建空列表存储所有发票号
invoice_numbers = []
# 遍历每一行,生成连续的发票号
for _, row in df.iterrows():
start = row['票据起号']
end = row['票据止号']
invoice_numbers.extend(range(start, end + 1))
将发票起止号处理成正常发票号后,再用symmetric_difference函数进行比对,把差异结果装入新的数据框,对应代码如下:
# 找出所有不一致的发票号(在两个集合中不同的元素)
differences = sorted(list(result_set.symmetric_difference(df1_set)))
完整代码处理顺序为:读取数据-转换发票起止号-比对差异-装入数据框-写入新文件:
看下效果:
票号范围转换为7万行数据再进行比对,整个过程也就几秒的时间,效率大大提升,所以处理数据量大的表格推荐使用Python。