昨天在外网找到一个比较dataframe的好库,叫datacompy,它的优点有:
1、可以把对比后的信息详情打印出来,比如列是否相等,行是否相等;
2、在数据中如果有不相等列,那么就只比较相同的列;
3、可以设置绝对差值和相对差值,比如我们比较有浮点数的数据时,设置下绝对差值为0.01,后面的一系列微小的值就忽略了;
4、在数据报告中,每一列的数据类型、不相等数量、最大差值和空值都详细列出来了;
5、可以把不相等的列单独取出来,取出来就是一个dataframe,可以查看具体哪些是不一样的;
下面这张图就是比较之后的报告:
代码如下:
import datacompy, pandas as pd, sys
files = []
try:
files = [sys.argv[1], sys.argv[2]]
except:
print('命令行未检测到文件参数。')
# 这个方式可以通过命令行运行:
#
# python3 cmpfiles.py testfile1.txt testfile2.txt
#
# 上面自带的两个参数,就是通过 sys.argv 获得的。
if len(files) == 0:
files = ['./TempFiles/temp_77.csv', './TempFiles/temp_77_new.csv']
# files = ['./TempFiles/temp_77.csv', './TempFiles/temp_77_copy.csv']
# 如果直接运行这个脚本,那么用西面定义的 files
df1 = pd.read_csv(files[0])
df2 = pd.read_csv(files[1])
compare = datacompy.Compare(df1, df2, join_columns='key')
# Compare 参数:
# df1: 数据框1
# df2: 数据框2
# join_columns: 指定索引的列名,默认“None”,可以传入数组,比如:['key', 'AdID']
# on_index: 是否要开启索引,开启之后不需要指定 join_columns,默认“False”
# abs_tol: 绝对公差,默认“0”
# rel_tal: 相对公差,默认“0”
# df1_name: 报告中数据框1的名字,默认“df1”
# df2_name: 报告中数据框2的名字,默认“df2”
# ignore_spaces: 是否忽略空格,默认“False”
# ignore_case: 是否忽略大小写,默认“False”
print(compare.matches()) # 最后判断是否相等,返回 bool
print(compare.report()) # 打印报告详情,返回 string
# print(compare.sample_mismatch('用户数')) # 取出不相同的某一列数据,返回 dataframe