Cet article présente principalement le DataFrame en python pour implémenter en détail la fusion de cellules Excel. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer
Je rencontre souvent le besoin de fusionner des cellules au travail. est sorti vers Excel, et certaines cellules doivent être fusionnées. Par exemple, dans le tableau ci-dessous, les cellules correspondantes des colonnes B et C doivent être fusionnées en fonction de la valeur de la colonne A
La méthode to_excel dans pandas ne peut fusionner que des index, et dans xlsxwriter, bien que la méthode merge_range soit fournie, ce n'est qu'une méthode de base, et à chaque fois il faut écrire des tests fastidieux pour enfin l'ajuster, et ce n'est pas très bon. Je veux donc écrire moi-même une méthode, combinant dataframe et merge_range. L'idée générale est la suivante :2. Définissez une méthode my_mergewr_excel. Les paramètres sont : le chemin d'accès à Excel, la liste key_cols utilisée pour déterminer si elle doit être fusionnée et la liste utilisée pour indiquer quelles colonnes de cellules doivent être fusionnées. >3. Modifiez MY_DataFrame Encapsulated en tant que module My_Module pour réutilisation.
L'algorithme de fusion est le suivant :
1. Effectuez le comptage et le tri des groupes en fonction de la [colonne clé] des paramètres donnés, et ajoutez deux colonnes auxiliaires CN et RN
3. Correspondant au groupe qui doit être fusionné, jugez la colonne actuelle Est-elle dans le paramètre donné [Fusionner la colonne] Si oui, utilisez la fusion pour écrire des cellules Excel sinon, écrivez des cellules Excel normalement ? .
4. Dans la colonne qui doit être fusionnée, si RN=1, appelez merge_range et écrivez immédiatement les cellules CN. Si RN>1, sautez la cellule, car dans RN=1 A ce moment-là, la cellule a été. fusionné et écrit Si erge_range est appelé à plusieurs reprises, une erreur sera signalée lors de l'ouverture du document Excel.
L'explication avec images est la suivante :
Le code spécifique est le suivant :
# -*- coding: utf-8 -*- """ Created on 20170301 @author: ARK-Z """ import xlsxwriter import pandas as pd class My_DataFrame(pd.DataFrame): def __init__(self, data=None, index=None, columns=None, dtype=None, copy=False): pd.DataFrame.__init__(self, data, index, columns, dtype, copy) 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 all([v in cols for i,v in enumerate(key_cols)])==False: #校验key_cols中各元素 是否都包含与对象的列 print("key_cols is not completely include object's columns") return False if all([v in cols for i,v in enumerate(merge_cols)])==False: #校验merge_cols中各元素 是否都包含与对象的列 print("merge_cols is not completely include object's columns") return False wb2007 = xlsxwriter.Workbook(path) worksheet2007 = wb2007.add_worksheet() format_top = wb2007.add_format({'border':1,'bold':True,'text_wrap':True}) format_other = wb2007.add_format({'border':1,'valign':'vcenter'}) for i,value in enumerate(cols): #写表头 #print(value) worksheet2007.write(0,i,value,format_top) #merge_cols=['B','A','C'] #key_cols=['A','B'] if key_cols ==[]: #如果key_cols 参数不传值,则无需合并 self_copy['RN']=1 self_copy['CN']=1 else: self_copy['RN']=self_copy.groupby(key_cols,as_index=False).rank(method='first').ix[:,0] #以key_cols作为是否合并的依据 self_copy['CN']=self_copy.groupby(key_cols,as_index=False).rank(method='max').ix[:,0] #print(self) for i in range(line_cn): if self_copy.ix[i,'CN']>1: #print('该行有需要合并的单元格') for j,col in enumerate(cols): #print(self_copy.ix[i,col]) if col in (merge_cols): #哪些列需要合并 if self_copy.ix[i,'RN']==1: #合并写第一个单元格,下一个第一个将不再写 worksheet2007.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]) else: pass #worksheet2007.write(i+1,j,df.ix[i,j]) else: worksheet2007.write(i+1,j,self_copy.ix[i,col],format_other) #print(',') else: #print('该行无需要合并的单元格') for j,col in enumerate(cols): #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)
Code d'appel :
import My_Module DF=My_DataFrame({'A':[1,2,2,2,3,3],'B':[1,1,1,1,1,1],'C':[1,1,1,1,1,1],'D':[1,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_mergewr_excel('000_2.xlsx',['A'],['B','C'])
L'effet est le suivant :
Vous pouvez également configurer la fusion des colonnes A et B :
DF.my_mergewr_excel('000_2.xlsx',['A'],['A','B'])
L'effet est le suivant :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!