多个excel表数据比对操作

多个excel表数据比对操作

本文主要使用两种方法进行比对,分别使用了openpyxl第三方库和pandas第三方库进行数据比对
两种方法优缺点:
openpyxy:
优点:主要是处理xlsx的文件,里面方法简单,易懂
缺点:当数据量大的时候,速度很慢,之前我一条一条数据拿出来比较,两百多条数据花了三个多小时,目前经过优化,速度上得到大幅度提升-约1分钟内,主要是一列一列的数据拿出来做比较,不在一条一条比较,这样速度得到了提升,但是没有之前直接获取某一列某一行的值做比对方便,需要考虑行数和列数!
pandas:
优点:可以处理xls、xlsx等多种文件,且速度很快
缺点:比较难懂,没有openpyxl那样丰富多样化

下面展示代码openpyxy:

class DoExcel_xlsx:def __init__(self,file_name1,sheet_name1,file_name2,sheet_name2):try:self.file_name = file_name1# self.file_name2 = file_name2# self.sheet_name = sheet_name1# self.sheet_name2 = sheet_name2self.workbook = openpyxl.load_workbook(file_name1)self.workbook2 = openpyxl.load_workbook(file_name2)self.sheet = self.workbook[sheet_name1]self.sheet2 = self.workbook2[sheet_name2]except Exception as e:print('case文件格式有误:{}'.format(e))def get_case(self):#创建一个列表,里面存放A列的数据ii1 = []ii2=[]for i in self.sheet['A']:ii1.append(i.value)for i in self.sheet2['A']:ii2.append(i.value)print(ii1)print(ii2)max_row = self.sheet.max_rowmax_row2 = self.sheet2.max_rowx = 1for r in range(2,len(ii1)+1):product_id = self.sheet.cell(row= r, column= 1).value #获取基金代码gzjz = self.sheet.cell(row= r, column= 10).valueprint('表1:----{}'.format(product_id))for i in  range(1,len(ii2)+1):product = self.sheet2.cell(row=i, column=1).valueprint('表2--{}'.format(product))print(product)if product_id == product :gzjz2 = self.sheet2.cell(row=i, column=10).valueshang = self.sheet2.cell(row=i, column=8).valuexia = self.sheet2.cell(row=i, column=9).valueif gzjz == gzjz2:print('没问题')continueelif gzjz != gzjz2:self.write_result(x,1,product_id)self.write_result(x,2,gzjz)self.write_result(x, 3, product)self.write_result(x, 4, gzjz2)x = x+1continuecontinueif product_id not in ii2 :self.write_result(x,1,product_id)self.write_result(x, 2, gzjz)x = x+1continueself.workbook.close()def write_result(self,row,col,productid):sheet = self.workbook['sheet2']sheet.cell(row,col).value = productid# sheet.cell(row,col).value = resultself.workbook.save(filename=self.file_name)在这里插入代码片

这里面,先把主列数据拿出来存做列表,通过两张表比对,找出存在A表但是不存在B表的数据,还有共同数据中不同的净值,然后新建一张sheet表存入数据,PS:这里这能通过找到A表中存在但是B表不存在的数据和共同数据,如果需要找到B表存在但是A表不存在的数据,需要把两张表顺序颠倒再运行一次

pandas代码如下:

class pandas_xls:def __init__(self,file_name1,sheet_name1,file_name2,sheet_name2):#按str读取文件,不做数据转换df1 = pd.read_excel(file_name1, dtype='str',sheet_name=sheet_name1)df2 = pd.read_excel(file_name2, dtype='str',sheet_name=sheet_name2)# print(df1.iloc[0])  #读取第一行,也可使用 df1.iloc[0]# print(df1['基金代码'])  #读取基金代码该列# row = 0li1 = df1['基金代码'].valuesli2 = df2['基金代码'].values# print(type(li1))# print(li2)# print(li1+li2)a = list(set(list(li1)+list(li2))-set(li1))print(a)b = list(set(list(li1)+list(li2))-set(li2))print(b)c = []d = []a1 = []b1 = []c1 = []d1 = []for r in list(set(li1).intersection(set(li2))):  # set(li1).intersection(set(li2))集合运算-交集rows_with_data1 = df1[df1['基金代码'] == r]rows_with_data2 = df2[df2['基金代码'] == r]row1 = rows_with_data1.index[0]  # 特定数据所在行# print(row1)row2 = rows_with_data2.index[0]  ## print(row2)try:gzsy1 = df1.loc[row1, '单位净值-估值']except KeyError as e:gzsy1 = Noneprint(gzsy1)try:gzsy2 = df2.loc[row2, '单位净值-估值']except KeyError as e:gzsy2 = Noneprint(gzsy2)if gzsy1 != gzsy2 :a1.append(r)b1.append(r)c1.append(gzsy1)d1.append(gzsy2)if a:  #找出df2中存在的数据print('只在df2中存在的数据{}'.format(a))for i in a:rows_with_data = df2[df2['基金代码'] == i]row = rows_with_data.index[0] # 特定数据所在行print('df2中:{}数据所在行{}'.format(i, row))# 查找这行数据的特定列的值try:gzsy2 = df2.loc[row, '单位净值-估值']except KeyError as e:# if pd.isnull(df2.loc[row, '单位净值-估值']):gzsy2 = None# else:#     print('检查{}数据是否有问题'.format(row))print('gzsy2:{}'.format(gzsy2))c.append(gzsy2)if b:print('只在df1中存在的数据{}'.format(b))print(b)for i in b:rows_with_data = df1[df1['基金代码'] == i]row = rows_with_data.index[0]  # 特定数据所在行print('df1中:{}数据所在行{}'.format(i, row))# 查找这行数据的特定列的值try:gzsy1 = df1.loc[row, '单位净值-估值']except KeyError as e:# if pd.isnull(df1.loc[row, '单位净值-估值']):gzsy1 = None# else:#     print('检查{}数据是否有问题'.format(row))print('gzsy1:{}'.format(gzsy1))d.append(gzsy1)# for r in range(len(a)):#     b.append(None)b[0:0] = [None]*len(a)d[0:0] = [None]*len(a)df = pd.DataFrame.from_dict({'估值3基金代码': a1 + a,'万份收益-估值3': c1+c,'估值6基金代码':  b1+b,'万份收益-估值6': d1+d,}, orient='index')   #创建dataframe数据表df = df.transpose()writer = pd.ExcelWriter('比对数据.xlsx')  # 创建ExcelWrite对象df.to_excel(writer)writer.close()

这里,逻辑和上方一样:也是获取相关列,然后数据进行比对,,但是做了一些为空的处理,而且可以找出两张表中分别不存在的数据依次存入新表中,

推荐使用第二种pandas方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551920.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【数学分析笔记】第4章第1节 微分和导数(1)

4. 微分 4.1 微分和导数 考虑一个函数 y f ( x ) yf(x) yf(x),当 x x x做一些微小的变动,函数值也会有微小的变动,比如: x → x △ x x\to x\bigtriangleup x x→x△x,则 f ( x ) → f ( x △ x ) f(x)\to f(x\bi…

【有啥问啥】卡尔曼滤波(Kalman Filter):从噪声中提取信号的利器

卡尔曼滤波(Kalman Filter):从噪声中提取信号的利器 什么是卡尔曼滤波? 卡尔曼滤波(Kalman Filter)是一种高效的递归滤波器,专为处理包含噪声的线性动态系统而设计。它能够从一系列不完全且含…

网盘能否作为FTP替代产品?企业该如何进行FTP国产化替代?

近年来,信创的概念引入和高效实践落地让更多的行业企业自发性地进行国产化替代,目前信创国产化替代还多发生在操作系统和应用层面,软件工具等目前还在下一阶段规划,但很多企业未雨绸缪,已经在做调研和尝试。 FTP作为世…

大屏娱乐体验新标杆:海信发布全新一代AI电视

在金秋送爽的9月29日,海信以一场盛大的“BIG PLAN百吋风暴”秋季新品发布会,正式揭开了AI电视新时代的序幕。 作为本场发布会上最耀眼的明星,海信AI电视E7N系列凭借无与伦比的AI画质技术和极致性能,引领大屏娱乐体验迈入全新境界&…

仿真设计|基于51单片机的多模式音乐跑马灯

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 1、16个发光二极管做跑马灯,跑马灯有10种模式。 2、按键可以切换跑马灯模式&#xff0…

Java笔试02

在网络操作系统中,TCP和UDP是传输层中两个非常重要的协议。TCP提供的是面向连接的、可靠的端到端通信机制,因此TCP协议在注重数据安全的场景下获得了极为广泛的应用。 TCP采用了确认和重发机制来确保数据的可靠传输。 相较于UDP,TCP的优势在…

.NET CORE程序发布IIS后报错误 500.19

发布IIS后浏览时报错误500.19,同时配置文件web.config的路径中也存在问号“?”。 可能原因:没有安装运行时

无人机之编队控制篇

无人机编队控制是指无人机集群在执行任务过程中,如何形成并保持一定的几何构型,以适应平台性能、战场环境、战术任务等要求的控制技术。以下是对无人机编队控制的详细解析: 一、无人机编队控制的主要任务 无人机编队控制主要解决两个问题&a…

Linux 线程同步

前言 上一期我们介绍了线程互斥,并通过加锁解决了多线程并发访问下的数据不一致问题!本期我们来介绍一下同步问题! 目录 前言 一、线程同步 • 线程同步的引入 • 同步的概念 理解同步和饥饿问题 • 条件变量 理解条件变量 • 同步…

系列一、初始ElasticSearch

前言: 最近公司的业务有用到ElasticSearch,虽然说之前业余时间也自学过ElasticSearch技术,但是在公司实际的业务中开发中没有用过,再加上时间比较久远了,很多东西都忘记了,基于此我决定系统的重新学习一下这…

个人项目简单https服务配置

1.SSL简介 SSL证书是一种数字证书,由受信任的证书颁发机构(CA)颁发,用于在互联网通信中建立加密链接。SSL代表“安全套接层”,是用于在互联网上创建加密链接的协议。SSL证书的主要目的是确保数据传输的安全性和隐私性…

鸿蒙NEXT开发环境搭建(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

PMP--三模--解题--51-60

文章目录 14.敏捷--每日站会--内容--• 上次站会以来我都完成了什么?• 从现在到下一次站会,我计划完成什么?• 我的障碍(或风险或问题)是什么?--每日站会能够同步与协调相关的活动。14.敏捷--Scrum板 Scru…

【Ubuntu】VMware中虚拟网卡与服务器网卡的绑定

文章目录 服务器网卡和VMware中虚拟网卡的绑定1.在本机上查看需要的网卡名称2.服务器本机设置固定ip3.打开VMware后,将虚拟网卡与本机真实网卡进行绑定。4.给routeOS分配4张网卡,如图所示:5.ubuntu1和ubuntu2只需分配vmnet0和vmnet8即可&…

《More Effective C++》的学习

引用与指针 没有所谓的null reference reference一定需要代表某个对象,所以C要求reference必须有初值。 QString &s; 使用reference可能比使用pointer更高效。 因为reference一定是有效的,而指针可能为空(需要多加一个判断&#xff0…

【PyTorch】图像目标检测

图像目标检测是什么 Object Detection 判断图像中目标的位置 目标检测两要素 分类:分类向量 [p0, …, pn]回归:回归边界框 [x1, y1, x2, y2] 模型如何完成目标检测 将3D张量映射到两个张量 分类张量:shape为 [N, c1]边界框张量&#xf…

索尼MDR-M1:超宽频的音频盛宴,打造沉浸式音乐体验

在音乐的世界里,每一次技术的突破都意味着全新的听觉体验。 索尼,作为音频技术的先锋,再次以其最新力作——MDR-M1封闭式监听耳机,引领了音乐界的新潮流。 这款耳机以其超宽频播放和卓越的隔音性能,为音乐爱好者和专…

深蕾半导体参加2024年度上海设计100+全球竞赛展览WDCC

展览介绍 WDCC2024 上海于2010年加入联合国教科文组织“创意城市网络”,定名为“设计之都”。“上海设计100”全球竞赛,遴选推广优秀设计案例,将“设计之都”的规划和愿景具体呈现。 ——展出时间、地点见文末—— 深蕾参展 深圳前海深蕾…

初识Linux · 进程等待

目录 前言: 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言: 通过上文的学习,我们了解了进程终止,知道终止是在干什么,终止的三种情况,以及有了退出码,错误码的概念&#xff…

Python | Leetcode Python题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; class Solution:def findDisappearedNumbers(self, nums: List[int]) -> List[int]:n len(nums)for num in nums:x (num - 1) % nnums[x] nret [i 1 for i, num in enumerate(nums) if num < n]return ret