python实现excel表格合并,pandas合并多个excel文件

  python实现excel表格合并,pandas合并多个excel文件

  工作中经常需要将数据导出到excel中,需要对部分单元格进行合并,比如下表,需要根据a列的值合并B列和C列中对应的单元格。

  熊猫中的to_excel方法只能合并索引,xlsxwriter中提供了merge_range方法,但只是基本方法。它每次都需要编写繁琐的测试才能最终调整好,而且不能很好的重用。所以想自己写一个方法,结合dataframe和merge_range。总的想法是:

  1.定义一个MY_DataFrame类,继承DataFrame类,不用重新组织数据结构就可以很好的利用熊猫的很多特性。

  2.定义一个my_mergewr_excel方法。参数有:Excel输出的路径,用来确定是否合并的key_cols列表,用来指明哪些列的单元格需要合并的列表。

  3.将MY_DataFrame封装到My_Module模块中重用。

  合并算法如下:

  1.根据给定参数的【关键列】,对组进行计数和排序,增加两个辅助列CN和RN。

  2.如果判断CN大于1,则需要合并分组;否则,分组(行)不需要合并(CN=1表示分组数据行是唯一的,不需要合并)

  3.根据要合并的分组,判断当前列是否在给定的参数[合并列]中。如果有,合并写excel单元格;否则就把excel单元格写成普通的。

  4.在要合并的列中,如果RN=1,调用merge_range,一次性记下CN个单元格。如果RN=1,跳过这个单元格,因为当RN=1时,这个单元格已经被合并写入了。如果你反复调用戈尔_range,你会在打开excel文档时得到一个错误。

  如下图所示:

  具体代码如下:

  # -*-编码:utf-8 -*-

  创建于20170301

  @作者:ARK-Z

  导入xlsxwriter

  进口熊猫作为pd

  类My_DataFrame(pd。数据帧):

  def __init__(self,data=None,index=None,columns=None,dtype=None,copy=False):

  pd.DataFrame.__init__(自身,数据,索引,列,数据类型,副本)

  def my_mergewr_excel(self,path,key_cols=[],merge_cols=[]):

  # sheet_name=Sheet1 ,na_rep= ,float_format=None,columns=None,header=True,index=True,index_label=None,startrow=0,startcol=0,engine=None,merge_cells=True,encoding=None,inf_rep=inf ,verbose=True):

  self_copy=My_DataFrame(self,copy=True)

  line_cn=self_copy.index.size

  cols=list(self _ copy . columns . values)

  If ([v in cols for I,v in enumerate(key_cols)])==false:#检查key _ cols中的所有元素是否包含带对象的列。

  print(key_cols不是完全包含对象的列)

  返回False

  If ([v in cols for I,v in enumerate(merge_cols)])==false:#检查merge _ cols中的所有元素是否包含带对象的列。

  打印( merge_cols不是完全包含对象的列)

  返回False

  wb2007=xlsxwriter。工作簿(路径)

  worksheet 2007=WB 2007 . add _ worksheet()

  format _ top=WB 2007 . add _ format({ border :1, bold:True, text_wrap:True})

  format _ other=WB 2007 . add _ format({ border :1, valign:vcenter})

  对于I,枚举中的值(列):#写入标头

  #打印(值)

  worksheet2007.write(0,I,value,format_top)

  #merge_cols=[B , A , C]

  #key_cols=[A , B]

  If _ cols==[]: #如果key_cols参数没有传递值,则不需要合并。

  self_copy[RN]=1

  self_copy[CN]=1

  否则:

  self _ copy[ rn ]=self _ copy . group by(key _ cols,as _ index=false)。Rank (method= first )。IX [:0] #以key _ cols作为是否合并的依据。

  self _ copy[ CN ]=self _ copy . group by(key _ cols,as_index=False)。rank(method=max )。ix[:0]

  #打印(自我)

  对于范围内的I(line _ cn):

  if self_copy.ix[i, CN]1:

  #print(该行有需要合并的单元格)

  对于j,枚举中的列(列):

  #print(self_copy.ix[i,col])

  Colin (merge _ cols): #哪些列需要合并?

  If _ copy.ix [i, rn]==1: #组合写第一个单元格,下一个第一个单元格不再写。

  工作表2007。merge _ range (I 1,j,I int (self _ copy.ix [I, cn]),j,self _ copy.ix [I,col],format _ other) # #合并单元格。根据LINE_SET[7],需要合并几个单元格。

  #worksheet2007.write(i 1,j,df.ix[i,col])

  否则:

  及格

  #worksheet2007.write(i 1,j,df.ix[i,j])

  否则:

  worksheet2007.write(i 1,j,self_copy.ix[i,col],format_other)

  #打印(,)

  否则:

  #print(此行中没有要合并的单元格)

  对于j,枚举中的列(列):

  #print(df.ix[i,col])

  worksheet2007.write(i 1,j,self_copy.ix[i,col],format_other)

  wb2007.close()

  self_copy.drop(CN ,axis=1)

  self_copy.drop(RN ,axis=1)

  呼叫代码:

  导入我的模块

  DF=My_DataFrame({A:[1,2,2,2,3,3], B:[1,1,1,1,1], C:[1,1,1,1,1,1], D:[1,1,1,1,1]})

  DF

  Out[120]:

  A B C D

  0 1 1 1 1

  1 2 1 1 1

  2 2 1 1 1

  3 2 1 1 1

  4 3 1 1 1

  5 3 1 1 1

  df . my _ merge wr _ excel( 000 _ 2 . xlsx ,[A],[B , C])

  效果如下:

  您也可以设置合并A列和B列:

  df . my _ merge wr _ excel( 000 _ 2 . xlsx ,[A],[A , B])

  效果如下:

  这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

  您可能感兴趣的文章:

  Python将多个excel文件合并成一个文件

  Python将多个excel表格合并成一个表格。

  Python合并同类型excel表格的方法

  Python批量合并Excel文件合并单元格详解

  时间:2018年3月30日

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

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