当前位置:   article > 正文

使用pandas的compare()方法做excel数据对比_pandas两个表格对比

pandas两个表格对比

目录

背景

思路梳理

代码详细讲解

常见报错


背景

        最近在测试工作中遇到开发做数据迁移,迁移前后表结构都没变,但是需要对迁移前后的几个表的数据进行校验比对,因为表的字段非常多,用sql和网上的数据对比工具看个人觉得看差异值都不是很直观。因此想到了python的pandas库写个脚本进行数据对比,并输出差异值。在实际工作中检验过了,用于数据对比是真的省时省力太多了。

        这里我只是将mysql表数据导出成excel,再对两份excel数据进行比对。如果可以直连数据库,本脚本也适用,只需要将读取excel部分代码改成连接数据库就行了。

思路梳理

  1. 读取excel数据
  2. 存入DataFrame中(pandas的二维数据结构)
  3. 对数据进行排序
  4. df.compare()方法对比两份数据
  5. 导出差异数据,并将两份源数据和差异数据放到同一个excel的不同sheet中

先看全部代码

  1. import time
  2. import pandas as pd
  3. # 数据内容对比
  4. def data_contect_compare(file_path1, file_path2, key):
  5. #将文件数据传入到DataFrame中
  6. df1 = pd.DataFrame(file_path1)
  7. df2 = pd.DataFrame(file_path2)
  8. # 按主键字段进行排序,并且重置索引数据
  9. df1 = df1.sort_values(key, ignore_index=True)
  10. df2 = df2.sort_values(key, ignore_index=True)
  11. # 差异数据导出
  12. time_now = time.strftime("%Y%m%d%H%M", time.localtime())
  13. with pd.ExcelWriter("对比数据" + time_now + ".xlsx") as writer:
  14. df1.to_excel(writer, "excel1")
  15. df2.to_excel(writer, "excel2")
  16. df1.compare(df2, result_names=("excel1", "excel2")).to_excel(writer, "差异数据")
  17. if __name__ == '__main__':
  18. # 读取excel
  19. excel1 = pd.read_excel('C:\\Users\\HP\\Downloads\\返利应收明细表-旧表.xlsx') # 迁移前文件路径
  20. excel2 = pd.read_excel('C:\\Users\\HP\\Downloads\\返利应收明细表-新表.xlsx') # 迁移后文件路径
  21. # 主键字段
  22. key = ['busi_month','contract_no','contract_version','clause_no','clause_version','supp_code',
  23. 'goods_code','acco_basis','goods_code','taskvolume_group_code','suit_scope_code','purc_company_code']
  24. # 数据内容比对
  25. data_contect_compare(excel1, excel2, key)

代码详细讲解

1、读取excel

pandas.read_excel()函数的语法如下:

  1. pd.read_excel("本地文件路径") # 第一个sheet
  2. pd.read_excel('本地文件路径', sheet_name=1) # 第二个sheet
  3. sheet pd.read_excel('本地文件路径', sheet_name='总结表') # 按sheet的名字

sheet_name可以指定Excel文件读取哪个sheet,如果不指定,默认读取第一个。

我的脚本代码:

  1. excel1 = pd.read_excel('C:\\Users\\HP\\Downloads\\返利应收明细表-旧表.xlsx') # 迁移前文件路径
  2. excel2 = pd.read_excel('C:\\Users\\HP\\Downloads\\返利应收明细表-新表.xlsx') # 迁移后文件路径

2、存入DataFrame中

DataFrame是Pandas定义的一个二维数据结构,我们得将数据存入到DataFrame才能调用pandas的一些方法对数据进行操作,DataFrame的结构如下图:

大概一看,这个结构是不是类似我们的excel和数据库的表,没错,我们就可以这么理解。

横向的称作行(row),我们所说的一条数据就是指其中的一行;

纵向的称作列(column)或者字段,是一条数据的某个值;

第一行是表头,或者叫字段名,类似于Python字典里的键,代表数据的属性;

第一列是索引,就是这行数据所描述的主体,也是这条数据的关键;

在一些场景下,表头和索引也称为列索引和行索引;在df.compare()方法中行索引和列索引顺序是非常重要的,因为df.compare()方法它的原理就是对行索引和列索引确定的唯一值逐一进行比对,如果两份数据的行和列排序不一致,那么你的脚本的输出结果是不可信的。

原文中代码:

  1. df1 = pd.DataFrame(file_path1)
  2. df2 = pd.DataFrame(file_path2)

3、对数据进行排序

sort_values()是pandas里用来进行数据排序的常用方法,它是按数据值的排序,数字按大小顺序,字符按字母顺序,默认排序是升序

  1. # 主键字段
  2. key = ['busi_month','contract_no','contract_version','clause_no','clause_version','supp_code',
  3. 'goods_code','acco_basis','goods_code','taskvolume_group_code','suit_scope_code','purc_company_code']
  4. df1 = df1.sort_values(key, ignore_index=True)
  5. df2 = df2.sort_values(key, ignore_index=True)

这里我是按表的主键先进行排序,再按行索引排序。

ignore_index=True的含义就是对行索引进行升序排序。

4、df.compare()方法对比两份数据

这个没什么多说的,语法也很简单,就是在DataFrame上使用compare()传入对比的DataFrame可进行数据对比,如:

  1. df1 = pd.DataFrame({'a': [1, 2], 'b': [5, 6]})
  2. df2 = pd.DataFrame({'a': [0, 2], 'b': [5, 7]})
  3. # 对比数据
  4. df1.compare(df2)
  5. '''
  6. a b
  7. self other self other
  8. 0 1.0 0.0 NaN NaN
  9. 1 NaN NaN 6.0 7.0
  10. '''

NaN就是空,代表没有差异

5、导出差异数据

 将DataFrame导出为Excel格式也很方便,使用DataFrame.to_excel方法即可。要想把DataFrame对象导出,首先要指定一个文件名,这个文件名必须以.xlsx或.xls为扩展名,生成的文件标签名也可以用sheet_name指定。语法如下:

  1. # 导出,可以指定文件路径
  2. df.to_excel('path_to_file.xlsx')
  3. # 指定sheet名,不要索引
  4. df.to_excel('path_to_file.xlsx', sheet_name='Sheet1', index=False)
  5. # 指定索引名,不合并单元格
  6. df.to_excel('path_to_file.xlsx', index_label='label', merge_cells=False)

我的脚本代码:

  1. # 差异数据导出
  2. time_now = time.strftime("%Y%m%d%H%M", time.localtime())
  3. with pd.ExcelWriter("对比数据" + time_now + ".xlsx") as writer:
  4. df1.to_excel(writer, "excel1")
  5. df2.to_excel(writer, "excel2")
  6. df1.compare(df2, result_names=("excel1", "excel2")).to_excel(writer, "差异数据")

最后导出的excel效果

我这里将迁移前、迁移后表数据、差异数据放到了同一个excel的不同sheet中,这样可以方便查看源表数据。大家还可以根据最左侧一列的编号能精准的查到源表的行数据,是不是很方便呢。

常见报错

 ValueError: Can only compare identically-labeled DataFrame objects 这是大家运行这个脚本时很有可能会遇到的问题

这种报错大部分情况是因为两个表的行索引和列索引不一致,所以如果出现这种报错,你首先应该排查两个excel列的顺序是否一致、行数是否相等。

好了,如果你也觉得本文章对你有用的话,留个小赞再走吧~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/444242
推荐阅读
相关标签
  

闽ICP备14008679号