python excel数据对比,对比excel python数据分析

  python excel数据对比,对比excel python数据分析

  用Python写一个Excel汇总比较小程序文章目录。Python中Excel汇总和比较小程序的前言。1.错误的想法。2.用熊猫加速矢量化运算。1.先了解一下Panda在处理大数据集时的一些经验规律。2.正确的对比思路。1.首先,我们需要知道要查找的不同内容包括什么。2.获取两个表之间的交集。设置3。焦点:【唯一识别码】如何判断同一个零件的内容是否发生了变化?1.举个例子。2.处理两个表的列名。3.横向整合两个表。4.直接通过dataframe比较相同列名的数据。5.将数据写入源代码并下载。

  前言最近由于工作需要,要多次比较两个Excel表(行列索引相同)中内容的变化,把变化的主管紫菜标注出来,所以想自己写一个比较程序。

  虽然网上也有类似的工具,Python也有公司库做对比,但是都不符合我的要求。我还是自己写个索引。这里不详细介绍所有代码,重点介绍一下比较的思路和开发过程中遇到的一些坑。

  第一,错误的想法。我需要的是对比一下各个主管紫菜的内容有没有变化。所以一开始,我的想法是根据行列索引遍历每个有能力的层进行比较,如下所示:

  import openpyxlimport time wb1=openpyxl . load _ workbook(。/cs/1 . xlsm )wb2=open pyxl . load _ workbook(。/cs/2 . xlsm )sheet 1=wb1 . active sheet 2=wb2 . active nrows=sheet 1 . max _ rowncols=sheet 1 . max _ column print(nrows)print(ncols)num=1 start=time . time()For range(1,nrows): for col in range (1,ncols): ifsheet1.cell (row,col)。value==sheet2.cell(行,列)。值:#这里复制了两个表,因此等于# print( old:% s-new:% s %(sheet 1 . cell(row,col))。value,sheet2.cell(行,列)。value)pass print(num)num=1 print(time . time()-start)

  我用的Excel表格数据是3000行32列。可以看出,循环总共遍历了96000次,耗时超过1s。但是我每次对比的数据至少都在12万左右,也就是说我在光循环里对比的数据至少有40s,这还不算读取和最后写入的时间,效率太低了。

  而且,这个方法有一个前提。我必须预先处理数据表,使每一行都相互对应。如果有增删,我们得不到结果。这一切方法显然都行不通。

  2.用Panda加速矢量化运算。1.先了解一下Panda处理大数据集的一些经验法则尽量使用向量化运算而不是解决df中for x的问题。如果你的代码很多for循环,那么可能更适合使用原生Python数据结构,因为Pandas会带来很大的开销。如果您有更复杂的操作,其中矢量化根本不可能或太难有效解决,请使用。应用方法。如果您必须遍历数组(这种情况确实会发生),请使用。iterrows()或。itertuples()来提高速度和语法。Pandas的选项很多,从A到b几乎都有几种方式,请注意这一点,比较不同方法的执行方式,选择在项目环境下效果最好的路线。一旦建立了数据清理脚本,就可以通过使用HDFStore存储中间结果来避免重新处理。将NumPy集成到Pandas操作中通常可以提高速度并简化语法。建议在这里看《还在抱怨pandas运行速度慢?这几个方法会颠覆你的看法》这篇文章,对熊猫的使用很有启发。

  2.正确的对比思路1。首先,我们需要明确要找的不同内容。如果这里有两个新表,并且这两个表中的列名完全相同,那么它们都有相同的行索引[唯一识别码],相同的[唯一识别码]对应相同的数据。

  因为涉及到增加和减少,那么两个表中可能会出现三种情况:

  当数据减少时,旧表中新表不具备的[唯一识别码]数据增加,新表具有旧表不具备的相同[唯一识别码]数据,里面的内容发生变化。2.获取两个表的交集和差集,import panda as PD import timed f1=PD . read _ excel(。/cs/1.xlsm ,Index_col=唯一识别码)df2=pd.read_excel(。/cs/2.xlsm ,Index_col=唯一识别码)#将[唯一识别码]列设置为索引df1.index=df1[唯一识别码]df2.index=df2[唯一识别码]Index 1=df1 . Index 2=df2 . Index jiaoji=list(Set(Index 1)。交集(set (index2)) #两个列表中相同的项目chaji 1=list (set (index1)。difference (set (index2))) #旧表与新表的数据不同,这包括,新表没有chaji2=list (set (index2)。difference (set (index1))) #新表的数据与旧表的数据不同,即新表有,但旧表没有print(吉焦[:10])print(chaji 1[:10])print(chaji 2[:10])1.

  如果得到差集1和差集2,就可以很容易地通过行索引得到新的和减少的数据。

  df _ chaji 1=df1 . loc[chaji 1]df _ chaji 2=df2 . loc[chaji 2]print(df _ chaji 1)print(df _ chaji 2)

  3.要点:【唯一识别码】如何判断同一部分的内容是否发生了变化?1.例如,这里有一个简单的案例列表。以下是表格数据。我们需要找出第一栏和第二栏数据之间的差异。

  Df=pd.read _ excel(。/test.xlsx ,index _ col=唯一识别码)res=df[列1]==df[列2]print(res)

  可以看到,dataframe中的数据可以直接与列进行比较,返回bool值,非常方便。

  那么,我们如何逐列比较两个表中的数据呢?

  2.处理两个表的列名。首先,我们重置两个表的列名。表1的列名是[列名-1],表2的列名是[列名-2]。

  columns=df1 . columns . to list()columns 1=list(map(lambda x:x -1 ,columns))columns 2=list(map(lambda x:x -2 ,columns))df _ jioji 1=df1 . loc[吉焦]df _ jioji 2=df2 . loc[吉焦]df _ jioji 1 . columns=columns 1 df _ jioji 2 . columns=columns 2 print(df _ jioji 1)print(df _ jioji 2)

  3.横向整合df _吉焦_ total=pd.concat ([df _吉焦1,df _吉焦2],轴=1) #轴=1表示横向整合打印(df _吉焦_total[[分类码-1 ,分类码-2]])

  反正看到这里,我知道我为什么要举上面的例子,就是为了能够直接通过列进行比较。如果思路很清晰,那么直接进入代码:

  4.直接按dataframe比较相同列名的数据。start=time.time()#比较所有同类型列的数据是否相等,得到一个带bool值的series迭代对象,保存在ser_list=map (lambda x,Y: df _吉焦_ total [x]==df _吉焦_ total [y],self.columns1,self.columns2) #将每个series转换为dataframe数据类型,用最早的列名设置(也可以不设置,但为了方便观察结果,还是设置)df _ list=map (lambda x,y: xcolumns) #水平拼接所有数据帧。如果数据为真,说明这个主管紫菜有相同的对比结果。true表示不同compare _ df=pd.concat (df _ list,axis=1) #筛选所有数据为TRUE的行的索引值,表示比较前后的结果相同。不需要记录Compare _ index=list(filter(lambda x:bool(1-all(Compare _ df . loc[x])),Compare_df.index))#根据最终的索引值,可以确定哪些数据比较结果不同#compare_bool用于定位哪些有能力的lavers不同#compare_result是原始数据自身。COMPARE _ bool=COMPARE _ df . loc[COMPARE _ index]self . COMPARE _ result=self . df2 . loc[COMPARE _ index]#将COMPARE _ bool的行和列索引设置为序列号类型,定位单元单元格位置nrows=COMPARE _ bool . shape[0]ncols=COMPARE _ bool . shape[1]COMPARE _ bool . index=range(nrows)COMPARE _ bool . columns=range(ncols)print(COMPARE _ bool)print(COMPARE _ result)print(time . time()-start)

  你可以明显发现,遍历确定1500行31列的数据差只需要0.25s,比之前的1.2s快很多,而且数据量越大越明显,有兴趣可以测试一下。

  5.在这里写数据,我用openpyxl库来写,主要是因为设置主管紫菜格式比较简单,因为我们要用黄色填充变更数据的主管紫菜。

  import pyxl from openpyxl . styles import pattern fillstart=time . time()WB=openpyxl . workbook()ws _吉焦=wb.create _ sheet(同一资产识别码的内容发生变化,0)# #创建一个主管紫菜样式,填充黄色,solid表示填充纯色,fill=pattern fill (solid ,fgcolor= ffff00) #首先将列名写入ws_jiaoJi.append(columns)#使用compare_bool作为遍历对象。如果值为FALSE,则表示数据发生了变化,主管层在compare _ bool.iterrows (): for x,y in enumerate(r):if y==FALSE:ws _ jiaoji . cell(row=I2,Column=x 1)中用黄色填充。fill=fill #使用compare_result遍历特定数据ws _ jiaoji.cell (row=i2,column=x1,value=compare _ result.iloc [i,x]) WB.save(。/compare.xlsx )打印(时间.

  您可以看到比较结果被正确地输出为Excel表格。

  但是这里不得不吐槽一下,写的速度真的很慢。希望有人能告诉我怎么加速。

  另外,如果有更好的想法,希望大家不吝赐教。

  下载源代码

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: