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)在被錯誤的標記成了掛科數(shù)據(jù)。
再例如:

對所有列填充后:

同樣存在大量數(shù)據(jù)或錯誤數(shù)據(jù)。
正確填充方式
思路:① 使用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不涉及公式,可以刪除下面內(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)文章
Django中多用戶角色和權(quán)限管理的實現(xiàn)步驟
定義用戶角色模型:首先,定義一個用戶角色模型,該模型表示不同的用戶角色,例如管理員、普通用戶、編輯等,這篇文章主要介紹了Django中多用戶角色和權(quán)限管理的實現(xiàn)步驟,需要的朋友可以參考下2024-05-05
Python網(wǎng)絡(luò)編程 Python套接字編程
這篇文章主要為大家詳細介紹了Python網(wǎng)絡(luò)編程的相關(guān)資料,Python套接字編程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
Python使用matplotlib.pyplot畫熱圖和損失圖的代碼詳解
眾所周知,在完成論文相關(guān)工作時畫圖必不可少,如損失函數(shù)圖、熱力圖等是非常常見的圖,在本文中,總結(jié)了這兩個圖的畫法,下面給出了完整的代碼,開箱即用,感興趣的同學(xué)可以自己動手嘗試一下2023-09-09
pandas數(shù)據(jù)預(yù)處理之dataframe的groupby操作方法
下面小編就為大家分享一篇pandas數(shù)據(jù)預(yù)處理之dataframe的groupby操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
python 如何用terminal輸入?yún)?shù)
這篇文章主要介紹了python 如何用terminal輸入?yún)?shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
tensorflow保持每次訓(xùn)練結(jié)果一致的簡單實現(xiàn)
今天小編就為大家分享一篇tensorflow保持每次訓(xùn)練結(jié)果一致的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02

