我正在研究数据比较项目。这里我有2个excel文件' Prod1'和' Proj1'我在python中导入的数据帧。两个数据框都有46个相同的列,标签相同。但是两个文件中的行数不同(例如,Prod1为100,而Proj1为110)。我想逐个单元格地比较并强调不匹配为“真实”。或者在另一个数据框中“错误”。哪个可以在excel中进一步导出。直到现在我能够读取文件,但在比较部分被击中。请帮助
import os
import pandas as pd
import numpy as np
import xlrd
os.getcwd()
os.chdir("C:\\Users\\desktop\\Python Project")
Prod1= pd.read_excel("Prod1.xls")
df1 = pd.read_excel('Prod1.xls', 'Prod1')
print(df1)
df2 = pd.read_excel('Proj1.xls', 'Proj1')
print(df2)
答案 0 :(得分:1)
假设df2是较大的数据帧,正如您在解释中所说,调整大小以匹配df1:
>>> df1 = df1.reindex(index=df2.index)
然后打印以下内容:
>>> print(df1 == df2)
示例强>
# Define two Pandas Dataframes
>>> df1 = pd.DataFrame(data={'col1': [1,2], 'col2': [3,4]})
>>> df2 = pd.DataFrame(data={'col1': [1,2,3], 'col2': [3,4,5]})
>>> df1
col1 col2
0 1 3
1 2 4
>>> df2
col1 col2
0 1 3
1 2 4
2 3 5
Dataframes的大小故意不匹配,因此如果您尝试执行以下操作:
>>> print(df1 == df2)
您会看到如下错误:
ValueError: Can only compare identically-labeled DataFrame objects
为了比较两者,使用较大的Dataframe df2的索引(这描述了应用于每一行的标签),我们用它来重新定义df1的索引。请注意,这仅适用于两个数据集使用相同索引的情况。
>>> df1 = df1.reindex(index=df2.index)
>>> df1
col1 col2
0 1.0 3.0
1 2.0 4.0
2 NaN NaN
现在,如果您尝试比较它们,您将看到以下内容:
>>> print(df1 == df2)
col1 col2
0 True True
1 True True
2 False False
答案 1 :(得分:0)
这是您想要的方法,首先让我们重新创建两个数据帧:
import itertools
import pandas as pd
import numpy as np
np.random.seed(1234)
df1 = pd.DataFrame(np.random.randint(0,2,size=(2,2)),columns=list('AB'))
df2 = pd.DataFrame(np.random.randint(0,2,size=(4,2)),columns=list('AB'))
Df1,Df2:
A B A B
0 1 1 0 0 0 # False
1 0 1 1 0 1 # True
2 1 1 # False
3 1 1 # False
现在我们通过将值压缩在一起来逐行比较这些数据帧,并确保所有.all()
值都相同。
[(a==b).all() for a,b in itertools.zip_longest(df1.values, df2.values)]
或没有izip_longest:
[(a==b).all() for a,b in zip(df1.values, df2.values)]+[False]*abs(len(df2)-len(df1))
输出是:
[False, True, False, False]