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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。