python之DataFrame实现excel合并单元格

在工作中经常遇到需要将数据输出到excel,且需要对其中一些单元格进行合并,比如如下表表格,需要根据A列的值,合并B、C列的对应单元格

pandas中的to_excel方法只能对索引进行合并,而xlsxwriter中,虽然提供有merge_range方法,但是这只是一个和基础的方法,每次都需要编写繁琐的测试才能最终调好,而且不能很好的重用。所以想自己写一个方法,结合dataframe和merge_range。大概思路是:

1、定义一个MY_DataFrame类,继承DataFrame类,这样能很好的利用pandas的很多特性,而不用自己重新组织数据结构。
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的时候,已经合并写了该单元格,若再重复调用erge_range,打开excel文档时会报错。

用图解释如下:

具体代码如下:

# -*- 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)

调用代码:

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'])

效果如下:

也可以设置合并A、B列:

DF.my_mergewr_excel('000_2.xlsx',['A'],['A','B'])

效果如下:

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

您可能感兴趣的文章:

  • Python将多个excel文件合并为一个文件
  • Python将多个excel表格合并为一个表格
  • python合并同类型excel表格的方法
  • Python批量合并有合并单元格的Excel文件详解
时间: 2018-03-30

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

利用Python,将多个excel文件合并为一个文件 思路 利用python xlrd包读取excle文件,然后将文件内容存入一个列表中,再利用xlsxwriter将内容写入到一个新的excel文件中. 完整代码 # -*- coding: utf-8 -*- #将多个Excel文件合并成一个 import xlrd import xlsxwriter #打开一个excel文件 def open_xls(file): fh=xlrd.open_workbook(file) return fh #

Python将多个excel表格合并为一个表格

生活中经常会碰到多个excel表格汇总成一个表格的情况,比如你发放了一份表格让班级所有同学填写,而你负责将大家的结果合并成一个.诸如此类的问题有很多.除了人工将所有表格的内容一个一个复制到汇总表格里,那么如何用Python自动实现这些工作呢~ 我不知道有没有其他更方便的合并方法,先用Python实现这个功能,自己用就很方便了. 比如,在文件夹下有如下7个表格(想象一下有100个或更多的表格需要合并) 作为样例,每个表格的内容均为 运行程序,将7个表格合并成了test.xls 打开test.xls

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

本文实例为大家分享了python合并同类型excel表格的具体代码,供大家参考,具体内容如下 python脚本如下,验证有效. #!/usr/bin/env python # -*- coding: UTF-8 -*- import os, csv class CSVTopoIreator: def __init__(self, filename): self.infile = open(filename, 'rb') self.reader = csv.reader(self.infile)

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

合并单元格 合并单元格相信大家都会,比如下面这段简单的代码就可以实现: app='Word' word=win32.gencache.EnsureDispatch('%s.Application' % app) doc=word.Documents.Add() word.Visible=False #Title begin sel =word.Selection sel.Font.Name = u"微软雅黑" sel.Font.Size = 8 sel.Font.Bold = Fals

PHPExcel合并与拆分单元格的方法

本文实例讲述了PHPExcel合并与拆分单元格的方法.分享给大家供大家参考,具体如下: $objPHPExcel; $filepath="c:\temp.xlsx"; try { $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objPHPExcel = $objReader->load($filepath); } catch (Exception $e) { die(); } $column_index

合并table相同单元格的jquery插件分享(很精简)

效果如下 原表格: col0 col1 col2 col3 SuZhou 11111 22222 SuZhouCity SuZhou 33333 44444 SuZhouCity SuZhou 55555 66666 SuZhouCity ShangHai 77777 88888 ShangHaiCity ShangHai uuuuu hhhhh ShangHaiCity ShangHai ggggg ccccc ShangHaiCity GuangZhou ttttt eeeee GuangZ

基于jquery的合并table相同单元格的插件(精简版)

效果如下 原表格: col0 col1 col2 col3 SuZhou 11111 22222 SuZhouCity SuZhou 33333 44444 SuZhouCity SuZhou 55555 66666 SuZhouCity ShangHai 77777 88888 ShangHaiCity ShangHai uuuuu hhhhh ShangHaiCity ShangHai ggggg ccccc ShangHaiCity GuangZhou ttttt eeeee GuangZ

使用 Python 合并多个格式一致的 Excel 文件(推荐)

一 问题描述 最近朋友在工作中遇到这样一个问题,她每天都要处理如下一批 Excel 表格:每个表格的都只有一个 sheet,表格的前两行为表格标题及表头,表格的最后一行是相关人员签字.最终目标是将每个表格的内容合并到一个 Excel 表格中,使之成为一张表格.在她未咨询我之前,每天复制粘贴这一类操作占用了她绝大部分时间.表格样式如下: 二 需求分析 根据她的描述,最终需求应该是这样的:在这一批表格中选取任意一个表格的前两行作为新表格的标题与表头,将这两行内容以嵌套列表的形式插入一个名为 data

Python批量创建迅雷任务及创建多个文件

其实不是真的创建了批量任务,而是用python创建一个文本文件,每行一个要下载的链接,然后打开迅雷,复制文本文件的内容,迅雷监测到剪切板变化,弹出下载全部链接的对话框~~ 实际情况是这样的,因为用python分析网页非常,比如下载某页中的全部pdf链接 from __future__ import unicode_literals from bs import BeautifulSoup import requests import codecs r = requests.get('you ur

JS合并两个数组的3种方法详解

这篇文章主要介绍了JS合并两个数组的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需要将两个数组合并成为一个的情况.比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合并成一个.方法如下: 1.concat js的Array对象提供了一个叫concat()方法,连接两个或更多的数组,并返回结果. var c = a.concat(b); //c=[1,2,3,4,5,6]

python中使用xlrd、xlwt操作excel表格详解

最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究"(用此一词让我觉得颇有成就感)之后,基本解决了日常所需.主要记录使用过程的常见问题及解决. python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库.可从这里下载https://pypi.python.org/pypi.下面分别记录python

python TCP Socket的粘包和分包的处理详解

概述 在进行TCP Socket开发时,都需要处理数据包粘包和分包的情况.本文详细讲解解决该问题的步骤.使用的语言是Python.实际上解决该问题很简单,在应用层下,定义一个协议:消息头部+消息长度+消息正文即可. 那什么是粘包和分包呢? 关于分包和粘包 粘包:发送方发送两个字符串"hello"+"world",接收方却一次性接收到了"helloworld". 分包:发送方发送字符串"helloworld",接收方却接收到了两

python下os模块强大的重命名方法renames详解

python下os模块强大的重命名方法renames详解 在python中有很多强大的模块,其中我们经常要使用的就是OS模块,OS模块提供了超过200个方法来供我们使用,并且这些方法都是和数据处理相关的,这里介绍下重命名这个方法. OS的重命名方法是os.rename,我用的ipython,这个玩意很是强大,只要按下TAB键,可以帮助我们自动对齐和列出可以使用的方法,发现有2个方法,分别是rename和renames,2个方法,前面的rename使用过无数次,但是后面的renames还没有使用过