最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python之DataFrame實現(xiàn)excel合并單元格

 更新時間:2021年02月22日 11:45:42   作者:周小科  
這篇文章主要為大家詳細介紹了python之DataFrame實現(xiàn)excel合并單元格,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在工作中經(jīng)常遇到需要將數(shù)據(jù)輸出到excel,且需要對其中一些單元格進行合并,比如如下表表格,需要根據(jù)A列的值,合并B、C列的對應(yīng)單元格

pandas中的to_excel方法只能對索引進行合并,而xlsxwriter中,雖然提供有merge_range方法,但是這只是一個和基礎(chǔ)的方法,每次都需要編寫繁瑣的測試才能最終調(diào)好,而且不能很好的重用。所以想自己寫一個方法,結(jié)合dataframe和merge_range。大概思路是:

1、定義一個MY_DataFrame類,繼承DataFrame類,這樣能很好的利用pandas的很多特性,而不用自己重新組織數(shù)據(jù)結(jié)構(gòu)。
2、定義一個my_mergewr_excel方法,參數(shù)分別為:輸出excel的路徑、用于判斷是否需要合并的key_cols列表、用于指明哪些列上的單元格需要被合并的列表
3、將MY_DataFrame封裝為一個My_Module模塊,以備重用。

合并的算法如下:

1、根據(jù)給定參數(shù)的【關(guān)鍵列】,進行分組計數(shù)和排序,添加CN和RN兩個輔助列
2、判斷CN大于1的,該分組需要合并,否則該分組(行)無需合并(CN=1說明這個分組數(shù)據(jù)行是唯一的,無需合并)
3、對應(yīng)需要合并的分組,判斷當(dāng)前列是不是在給定參數(shù)【合并列】中,是則用合并寫excel單元格,否則就是普通的寫excel單元格。
4、在需要合并的列中,如果對于的RN=1則調(diào)用merge_range,一次性寫想下寫CN個單元格,如果RN>1則跳過該單元格,因為在RN=1的時候,已經(jīng)合并寫了該單元格,若再重復(fù)調(diào)用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 參數(shù)不傳值,則無需合并 
   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作為是否合并的依據(jù) 
   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) ##合并單元格,根據(jù)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) 

調(diào)用代碼:

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

效果如下:

也可以設(shè)置合并A、B列:

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

效果如下:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python的open函數(shù)使用案例代碼

    python的open函數(shù)使用案例代碼

    python打開文件使用open()函數(shù),返回一個指向文件的指針,在python中使用open函數(shù)對文件進行處理,這篇文章主要介紹了python中的open函數(shù)使用,需要的朋友可以參考下
    2023-02-02
  • ipython和python區(qū)別詳解

    ipython和python區(qū)別詳解

    在本篇文章里小編給大家分享了關(guān)于ipython和python區(qū)別的相關(guān)知識點,有興趣的朋友們跟著學(xué)習(xí)下。
    2019-06-06
  • python3如何使用Requests測試帶簽名的接口

    python3如何使用Requests測試帶簽名的接口

    這篇文章主要介紹了python3如何使用Requests測試帶簽名的接口,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Python偏函數(shù)介紹及用法舉例詳解

    Python偏函數(shù)介紹及用法舉例詳解

    偏函數(shù)(Partial function)是Python的functools模塊提供的一個很有用的功能,它允許我們通過固定部分參數(shù)或關(guān)鍵字參數(shù)來創(chuàng)建一個新的函數(shù),這篇文章主要給大家介紹了關(guān)于Python偏函數(shù)介紹及用法舉例詳解的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • Python中創(chuàng)建包和增添包的路徑(sys.path.append())

    Python中創(chuàng)建包和增添包的路徑(sys.path.append())

    本文主要介紹了Python中創(chuàng)建包和增添包的路徑(sys.path.append()),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Pygame Draw繪圖函數(shù)的具體使用

    Pygame Draw繪圖函數(shù)的具體使用

    Pygame 中提供了一個draw模塊用來繪制一些簡單的圖形狀,比如矩形、多邊形、圓形、直線、弧線等,本文就詳細的介紹一下如何使用
    2021-11-11
  • python HTTPX庫實現(xiàn)同步異步請求用法示例

    python HTTPX庫實現(xiàn)同步異步請求用法示例

    這篇文章主要為大家介紹了python HTTPX庫實現(xiàn)同步異步請求用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • python selenium對應(yīng)的瀏覽器chromedriver版本不一致問題

    python selenium對應(yīng)的瀏覽器chromedriver版本不一致問題

    這篇文章主要介紹了python selenium對應(yīng)的瀏覽器chromedriver版本不一致問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python爬蟲之m3u8文件里提取小視頻的正確姿勢

    Python爬蟲之m3u8文件里提取小視頻的正確姿勢

    本文給大家分享如何正確提取m3u8文件里的.ts視頻,并合成完整的.mp4格式視頻,通過圖文實例代碼的形式給大家介紹的非常詳細,對Python提取m3u8文件小視頻感興趣的朋友一起看看吧
    2021-05-05
  • Python pandas進行數(shù)據(jù)預(yù)處理的實現(xiàn)

    Python pandas進行數(shù)據(jù)預(yù)處理的實現(xiàn)

    本案例通過使用pandas庫對電子商務(wù)客戶數(shù)據(jù)進行數(shù)據(jù)預(yù)處理,包括數(shù)據(jù)導(dǎo)入、查看、缺失值處理等處理,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01

最新評論

兴业县| 密山市| 南阳市| 滁州市| 淮北市| 木里| 凤凰县| 兴文县| 兴安盟| 营山县| 湄潭县| 确山县| 富蕴县| 泽州县| 姜堰市| 和田县| 廊坊市| 三穗县| 宁河县| 阿拉善右旗| 墨玉县| 长岛县| 彩票| 舞阳县| 陆丰市| 南华县| 邛崃市| 晋州市| 乐至县| 招远市| 中江县| 祥云县| 宜兰市| 积石山| 丰镇市| 正宁县| 张家界市| 华亭县| 新沂市| 梧州市| 宜春市|