Pandas读取excel合并单元格的正确方式(openpyxl合并单元格拆分并填充内容)

 更新时间:2023年06月15日 09:51:37   作者:iioSnail  
Excel文件中可能包含合并单元格的数据,下面这篇文章主要给大家介绍了关于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合并单元格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用 Python 写一个简易的抽奖程序

    使用 Python 写一个简易的抽奖程序

    这篇文章主要介绍了使用 Python 写一个简易的抽奖程序,本文通过实例代码,思路讲解的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • Python 自制简单版《我的世界》的详细过程

    Python 自制简单版《我的世界》的详细过程

    这篇文章主要介绍了教你用 Python 自制简单版《我的世界》,接下来,我们就带你运行这个项目,并对这个开源的小游戏做一下简单的更改,让它变成“你的”世界
    2021-11-11
  • Python的OptionParser模块示例教程

    Python的OptionParser模块示例教程

    这篇文章主要介绍了Python的OptionParser模块教程,本文通过示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • windows python3安装Jupyter Notebooks教程

    windows python3安装Jupyter Notebooks教程

    这篇文章主要介绍了windows python3安装Jupyter Notebooks教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python多线程及其基本使用方法实例分析

    Python多线程及其基本使用方法实例分析

    这篇文章主要介绍了Python多线程及其基本使用方法,结合实例形式分析了Python相关概念、原理、使用方法及操作注意事项,需要的朋友可以参考下
    2019-10-10
  • Python Collatz序列实现过程解析

    Python Collatz序列实现过程解析

    这篇文章主要介绍了Python Collatz序列实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • OpenCV角点检测的实现示例

    OpenCV角点检测的实现示例

    角点通常被定义为两条边的交点,本文主要介绍了OpenCV角点检测的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 使用Python的web.py框架实现类似Django的ORM查询的教程

    使用Python的web.py框架实现类似Django的ORM查询的教程

    这篇文章主要介绍了使用Python的web.py框架实现类似Django的ORM查询的教程,集成的ORM操作数据库向来是Python最强大的功能之一,本文则探讨如何在web.py框架上实现,需要的朋友可以参考下
    2015-05-05
  • python3实现Dijkstra算法最短路径的实现

    python3实现Dijkstra算法最短路径的实现

    这篇文章主要介绍了python3实现Dijkstra算法最短路径的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • pyenv虚拟环境管理python多版本和软件库的方法

    pyenv虚拟环境管理python多版本和软件库的方法

    这篇文章主要介绍了pyenv虚拟环境管理python多版本和软件库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论