Pandas讀取excel合并單元格的正確方式(openpyxl合并單元格拆分并填充內(nèi)容)
問題介紹(ffill填充存在的問題)
在pandas讀取excel經(jīng)常會遇到合并單元格的問題。例如:
此時使用pandas讀取到的內(nèi)容為:
如果去百度,幾乎所有人會說應(yīng)該用如下代碼:
df['班級'] = df['班級'].ffill()
這樣看起來沒問題,但是,該解決方案并不能適用于所有場景,甚至?xí)斐蓴?shù)據(jù)錯誤。
例如:
對班級和備注填充后:
孫武空本來是數(shù)據(jù)缺失,現(xiàn)在被錯誤的標(biāo)記成了掛科數(shù)據(jù)。
再例如:
對所有列填充后:
同樣存在大量數(shù)據(jù)或錯誤數(shù)據(jù)。
正確填充方式
思路:① 使用openpyxl將合并單元格拆分,生成中間文件 ② 讀取中間文件
第一步,使用如下工具類生成拆分單元格并生成中間文件:
import openpyxl # 拆分所有的合并單元格,并賦予合并之前的值。 # 由于openpyxl并沒有提供拆分并填充的方法,所以使用該方法進(jìn)行完成 def unmerge_and_fill_cells(worksheet): all_merged_cell_ranges = list( worksheet.merged_cells.ranges ) for merged_cell_range in all_merged_cell_ranges: merged_cell = merged_cell_range.start_cell worksheet.unmerge_cells(range_string=merged_cell_range.coord) for row_index, col_index in merged_cell_range.cells: cell = worksheet.cell(row=row_index, column=col_index) cell.value = merged_cell.value # 讀取原始xlsx文件,拆分并填充單元格,然后生成中間臨時文件。 def unmerge_cell(filename): wb = openpyxl.load_workbook(filename) for sheet_name in wb.sheetnames: sheet = wb[sheet_name] unmerge_and_fill_cells(sheet) filename = filename.replace(".xls", "_temp.xls") wb.save(filename) wb.close() # openpyxl保存之后,再用pandas讀取會存在公式無法讀取到的情況,使用下面方式就可以了 # 如果你的excel不涉及公式,可以刪除下面內(nèi)容 # 原理為:使用windows打開excel,然后另存為一下 from win32com.client import Dispatch xlApp = Dispatch("Excel.Application") xlApp.Visible = False xlBook = xlApp.Workbooks.Open(str(Path(".").absolute() / filename)) # 這里必須填絕對路徑 xlBook.Save() xlBook.Close() return filename if __name__ == '__main__': unmerge_cell("test.xlsx")
拆分后的sheet頁如圖:
然后再使用pandas讀取中間文件即可:
import pandas as pd df = pd.read_excel("test_temp.xlsx")
結(jié)果為:
總結(jié)
到此這篇關(guān)于Pandas讀取excel合并單元格的正確方式的文章就介紹到這了,更多相關(guān)Pandas讀取excel合并單元格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 進(jìn)程的幾種創(chuàng)建方式詳解
這篇文章主要介紹了python 進(jìn)程的幾種創(chuàng)建方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08一文詳解如何在Python中進(jìn)行數(shù)學(xué)建模
數(shù)學(xué)建模是數(shù)據(jù)科學(xué)中使用的強(qiáng)大工具,通過數(shù)學(xué)方程和算法來表示真實世界的系統(tǒng)和現(xiàn)象,本文將指導(dǎo)大家完成Python中的數(shù)學(xué)建模過程,感興趣的可以了解下2024-11-11Anaconda 查看、創(chuàng)建、管理和使用python環(huán)境的方法
這篇文章主要介紹了Anaconda 查看、創(chuàng)建、管理和使用python環(huán)境的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12python3.8動態(tài)人臉識別的實現(xiàn)示例
這篇文章主要介紹了python3.8動態(tài)人臉識別的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09