比较从excel

时间:2018-02-19 18:55:44

标签: python excel pandas dataframe

我正在研究数据比较项目。这里我有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) 

2 个答案:

答案 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]