問題介紹(ffill填充存在的問題)
在pandas讀取excel經(jīng)常會遇到合并單元格的問題。例如:
此時使用pandas讀取到的內(nèi)容為:
如果去百度,幾乎所有人會說應該用如下代碼:
df['班級'] = df['班級'].ffill()
這樣看起來沒問題,但是,該解決方案并不能適用于所有場景,甚至會造成數(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")
結果為:文章來源:http://www.zghlxwxcb.cn/news/detail-779308.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-779308.html
到了這里,關于Pandas讀取excel合并單元格的正確姿勢(openpyxl合并單元格拆分并填充內(nèi)容)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!