问题介绍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")

结果为:

在这里插入图片描述

原文地址:https://blog.csdn.net/zhaohongfei_358/article/details/128909467

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_44952.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注