比较2个excel文件,方法是固定1个工作表的1列,然后使用python与另一个具有相同列的文件进行比较
我们有两个excel文件,一个有7.5k记录,另一个有7k记录。我们需要通过将一张表中的一个特定列保持为固定列来比较数据,以便与另一张表进行比较 例如,表1:比较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
**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}