Pandas讀取excel合并單元格的正確方式(openpyxl合并單元格拆分并填充內容)
問題介紹(ffill填充存在的問題)
在pandas讀取excel經常會遇到合并單元格的問題。例如:

此時使用pandas讀取到的內容為:

如果去百度,幾乎所有人會說應該用如下代碼:
df['班級'] = df['班級'].ffill()

這樣看起來沒問題,但是,該解決方案并不能適用于所有場景,甚至會造成數據錯誤。
例如:

對班級和備注填充后:

孫武空本來是數據缺失,現在被錯誤的標記成了掛科數據。
再例如:

對所有列填充后:

同樣存在大量數據或錯誤數據。
正確填充方式
思路:① 使用openpyxl將合并單元格拆分,生成中間文件 ② 讀取中間文件
第一步,使用如下工具類生成拆分單元格并生成中間文件:
import openpyxl
# 拆分所有的合并單元格,并賦予合并之前的值。
# 由于openpyxl并沒有提供拆分并填充的方法,所以使用該方法進行完成
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不涉及公式,可以刪除下面內容
# 原理為:使用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")結果為:

總結
到此這篇關于Pandas讀取excel合并單元格的正確方式的文章就介紹到這了,更多相關Pandas讀取excel合并單元格內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python讀取配置文件-ConfigParser的二次封裝方法
這篇文章主要介紹了Python讀取配置文件-ConfigParser的二次封裝方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Python中threading模塊join函數用法實例分析
這篇文章主要介紹了Python中threading模塊join函數用法,以實例形式較為詳細的分析了join函數的功能與使用方法,需要的朋友可以參考下2015-06-06
Python?Diagrams創(chuàng)建高質量圖表和流程圖實例探究
Python?Diagrams是一個強大的Python庫,使創(chuàng)建這些圖表變得簡單且靈活,本文將深入介紹Python?Diagrams,包括其基本概念、安裝方法、示例代碼以及一些高級用法,以幫助大家充分利用這一工具來創(chuàng)建令人印象深刻的圖表2024-01-01

