比较2个excel文件,方法是固定1个工作表的1列,然后使用python与另一个具有相同列的文件进行比较

比较2个excel文件,方法是固定1个工作表的1列,然后使用python与另一个具有相同列的文件进行比较,python,excel,excel-2010,xlrd,Python,Excel,Excel 2010,Xlrd,我们有两个excel文件,一个有7.5k记录,另一个有7k记录。我们需要通过将一张表中的一个特定列保持为固定列来比较数据,以便与另一张表进行比较 例如,表1: **Emp_ID| Name| Phone| Address** ------------------------------------- 1 | A | 123 | ABC ------------------------------------- 2 | B | 456

我们有两个excel文件,一个有7.5k记录,另一个有7k记录。我们需要通过将一张表中的一个特定列保持为固定列来比较数据,以便与另一张表进行比较

例如,表1:

**Emp_ID|   Name|   Phone|  Address**
-------------------------------------
1       |     A |    123 |  ABC
-------------------------------------
2       |     B |    456 |  CBD
-------------------------------------
3       |     C |    789 |  S
例如,表2:

**Emp_ID|   Name|   Phone|  Address**
-------------------------------------
1       |     A |    123 |  ABC
-------------------------------------
3       |     C |    789 |  S
Python比较应该基于Emp_ID,并且在执行Python脚本时将参数作为Emp_ID传递时,Emp_ID=2应该作为缺失输出。 我尝试使用XLRD模块进行相同的操作,但它只逐个单元格进行比较,而不是冻结一列,然后将行与其他excel文件进行比较

def compareexcel(oldSheet, newSheet):
        rowb2 = xlrd.open_workbook(oldSheet)
        rowb1 = xlrd.open_workbook(newSheet)
        sheet1 = rowb1.sheet_by_index(0)
        sheet2 = rowb2.sheet_by_index(0)

        for rownum in range(max(sheet1.nrows, sheet2.nrows)):
            if rownum < sheet1.nrows:
                row_rb1 = sheet1.row_values(rownum)
                row_rb2 = sheet2.row_values(rownum)

                for colnum, (c1, c2) in enumerate(izip_longest(row_rb1, row_rb2)):
                    if c1 != c2:                    
                        print "Row {} Col {} - {} != {}".format(rownum+1, colnum+1, c1, c2)
def compareexcel(旧页、新闻页):
行B2=xlrd.打开\u工作簿(旧工作表)
行B1=xlrd.open_工作簿(新闻纸)
sheet1=行B1。按索引(0)排列的工作表
sheet2=第B2行。按索引(0)排列的工作表
对于范围内的行数(最大值(sheet1.nrows,sheet2.nrows)):
如果rownum
我编写了一个函数,用于在另一张表中搜索列值,并在此基础上在比较函数中进行比较

def search(sheet2 , s):
    for row in range(sheet2.nrows):`enter code here`
        if s == sheet2.cell(row,0).value:
            return (row,0)
    return (9,9)

def compare(oldPerPaxSheet,newPerPaxSheet):
    rb1 = xlrd.open_workbook(oldPerPaxSheet)
    rb2 = xlrd.open_workbook(newPerPaxSheet)
    sheet1 = rb1.sheet_by_index(0)
    sheet2 = rb2.sheet_by_index(0)

    for rownum in range(max(self.sheet1.nrows, self.sheet2.nrows)):
            if rownum < sheet1.nrows:
                    row_rb1 = sheet1.row_values(rownum)
                    print ("row_rb1 : "), row_rb1

                    search_str = sheet1.cell(rownum,0).value

                    r,c = search(sheet2,search_str)
                    if (c != 9):
                            row_rb2 = sheet2.row_values(r)
                            for colnum, (c1, c2) in enumerate(izip_longest(row_rb1, row_rb2)):
                                    if c1 != c2:                    
                                            print "Row {} Col {} - {} != {}".format(rownum+1, colnum+1, c1, c2)
                    else:
                            print ("ROw does not exists in the other sheet")
                            pass
            else:
                    print ("Row {} missing").format(rownum+1)
def搜索(第2页):
对于范围内的行(sheet2.nrows):`在此处输入代码`
如果s==sheet2.单元格(行,0).值:
返回(第0行)
返回(9,9)
def比较(旧PERPAXSheet、新PERPAXSheet):
rb1=xlrd.open_工作簿(oldparxsheet)
rb2=xlrd.open_工作簿(newPerPaxSheet)
sheet1=rb1。按索引(0)排列的工作表
sheet2=rb2。按索引(0)排列的工作表
对于范围内的行数(最大值(self.sheet1.nrows,self.sheet2.nrows)):
如果rownum
您可以轻松地使用它

我将用
Emp\u ID
作为索引制作2个数据帧

import pandas as pd

sheets = pd.read_excel(excel_filename, sheetname=[old_sheet, new_sheet], index_col=0)
sheet1 = sheets[old_sheet]
sheet2 = sheets[new_sheet]
我添加了一些行以获得更清晰的差异

表1

表2

计算缺失的
Emp_ID
变得非常简单

missing_in_1  = set(sheet2.index) - set(sheet1.index) 
missing_in_2  = set(sheet1.index) - set(sheet2.index) 
_1中缺少_,_2中缺少_

因此,表1没有表2中的
Emp_ID
4,而表2缺少一个2,正如预期的那样

然后为了寻找差异,我们在两张纸上做了一个内部连接

combined = pd.merge(sheet1, sheet2, left_index=True, right_index=True, suffixes=('_1', '_2'))
合二为一

并在表1的列上循环查找差异,并将其保存在
dict

differences = {}
for column in sheet1.columns:
    diff = combined[column+'_1'] != combined[column+'_2']
    if diff.any():
        differences[column] = list(combined[diff].index)
分歧

如果需要完整的差异列表,可以将最后一行更改为
differences[column]=combined[diff]

分歧


如果:1 | A | 123 | ABC但在表2-1 | A | 333 | AAA中会发生什么?你预期的最终结果是什么?然后应该进行正常的比较。预期最终结果:如果工作表中缺少任何emp id,则不应进行比较,只有当emp_id相同时,才应进行比较。这帮助我解决了问题。感谢回复,不幸的是,我只能使用XLRD模块。但另一方面,我尝试安装panda,但由于安装过程中存在各种依赖关系,所以无法安装。
({4}, {2})
combined = pd.merge(sheet1, sheet2, left_index=True, right_index=True, suffixes=('_1', '_2'))
    Name_1  Phone_1     Address_1   Name_2  Phone_2     Address_2
Emp_ID                      
1   A   123     ABC     A   123     ABC
3   C   789     S   C   789     S
5   A   123     ABC     E   123     ABC
differences = {}
for column in sheet1.columns:
    diff = combined[column+'_1'] != combined[column+'_2']
    if diff.any():
        differences[column] = list(combined[diff].index)
{'Name': [5]}
{'Name':        
         Name_1  Phone_1 Address_1 Name_2  Phone_2 Address_2
 Emp_ID                                                    
 5           A      123       ABC      E      123       ABC}