Python 比较从excel导入的2个数据帧

Python 比较从excel导入的2个数据帧,python,excel,pandas,dataframe,Python,Excel,Pandas,Dataframe,我正在从事数据比较项目。这里有两个excel文件“Prod1”和“Proj1”,它们是我在python中作为数据帧导入的。两个数据帧都有46个相同的列,带有相同的标签。但两个文件的行数不同(例如,Prod1的行数为100,而Proj1的行数为110)。我想逐个单元格比较值,并在另一个数据帧中将不匹配突出显示为“真”或“假”。可以在excel中进一步导出。到目前为止,我能够阅读这些文件,但在比较部分却被击中了。好心协助 import os import pandas as pd import

我正在从事数据比较项目。这里有两个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) 

这是您想要的方法,首先让我们重新创建两个数据帧:

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)]
或者没有伊兹普大学:

[(a==b).all() for a,b in zip(df1.values, df2.values)]+[False]*abs(len(df2)-len(df1))
输出为:

[False, True, False, False]

假设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
数据帧故意在大小上不匹配,因此如果您尝试执行以下操作:

>>> print(df1 == df2)
>>> print(df1 == df2)
    col1   col2
0   True   True
1   True   True
2  False  False
您将看到如下错误:

ValueError: Can only compare identically-labeled DataFrame objects
为了比较两者,我们使用较大数据帧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)
>>> print(df1 == df2)
    col1   col2
0   True   True
1   True   True
2  False  False

向我们展示print(df1.head())的外观。另外,请告诉我们您希望导出的excel inprint(df1.head(0))空数据框列的格式:[会计分录ID、证券分录ID、POS类型分录ID、日分录ID、组合键、PSI事实集、会计编号、交易编号、TIS SEQU、原始面、数量、交易日期、结算日期、交易价格、本地应计利息、本地净额、交易CD、本地货币、基础货币、交易编号、外汇合同、外汇合同货币、本金金额、,本金金额基数、纳税日期、分录日期、分录时间、冲销日期、冲销时间、截止日期、现金本地减少、现金本地增加、交易类型、增加数量、删除数量,确定有很多列。尝试与df1共享数据。head(1)至少。输出应为excel格式。由于字符限制,我无法添加所有列。文件中的列是字符串、数字、日期、打印(df1.head(1))的混合体账户尺寸ID Sect\u DIM\u ID POS\u TYPE\u DIM\u ID DAY\u DIM\u ID\0 443 599133 86 2018-02-01复合密钥PSI事实集账户编号\0 638806--P-USD-38848-20180201-134904--X9X9USDBLKR9 515交易编号按原始交易编号…\0 38848 638806.00…SYSTEM\u LAST\u UPDATED\u BY_USER\u ID SYSTEM\u LAST\u UPDATED\u DATE\0 PMA 2018-02-01 23:30:16嗨,Ben,你能解释一下代码吗?仅仅为了理解df1=df1.reindex(index=df2.index)@AbhishekGupta基本上你给df1的索引和df2的索引相同(df2有一个较长的索引,因此df1最后填充了NAN)。嘿@AbhishekGupta,我将为答案添加更多细节,并展示一个示例。