Maison  >  Article  >  développement back-end  >  Le DataFrame de Python implémente Excel Merged Cells_python

Le DataFrame de Python implémente Excel Merged Cells_python

不言
不言original
2018-04-02 16:19:219890parcourir

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 :


1. Définir une classe MY_DataFrame et hériter de la classe DataFrame. Cela peut faire bon usage de nombreuses fonctionnalités des pandas sans avoir à réorganiser vous-même la structure des données.

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

2, s'il est jugé que CN est supérieur à 1, le groupe doit être fusionné, sinon le groupe (ligne) n'a pas besoin d'être fusionné (CN=1 signifie que la ligne de données du groupe est unique et n'a pas besoin d'être fusionnée. à fusionner)

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn