用熊猫将Excel工作表(Listobject)读入python

Posted

技术标签:

【中文标题】用熊猫将Excel工作表(Listobject)读入python【英文标题】:Read Excel sheet table (Listobject) into python with pandas 【发布时间】:2020-02-12 08:36:14 【问题描述】:

有多种方法可以将 excel 数据读入 python。 Pandas 还提供了用于读写的 API

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile

df = pd.read_excel('File.xlsx', sheetname='Sheet1')

效果很好。

但是:将每张工作表的表格直接访问到 pandas 数据框的方法是什么??

上图显示了一张包含表格 SEPARATED THAN CELL (1,1) 的表格。

此外,工作表可能包含多个表格(VBA 中的列表对象)。

我在任何地方都找不到将它们读入熊猫的方法。

注意 1:无法修改工作簿以将所有表格移至单元格 (1,1)。 注意2:我想只使用熊猫(如果可能的话)并尽量减少导入其他库的需要。但是没有其他方法我准备使用其他lybray。无论如何,例如,我无法使用 xlwings 进行管理。

here好像可以解析excel文件,但不提供表格污染,只针对完整的表格。

documentation of pandas 似乎不提供这种可能性。

谢谢。

【问题讨论】:

如果每个表的行为都相同,您现在可以使用 pd.read_excel(file, skiprows=n) 中的跳过行在单个语句 df = pd.concat(pd.read_excel(file, sheet_name=None, skiprows=n), ignore_index=True) 中访问所有工作表或使用 pd.ExcelWriter(file) 当我回答@Florian 时,我的想法是excel 文件不是我的,我无法打开它并为每张工作表更改python 代码。应该有办法。 Listobject 是 excel 中一个非常好的和强大的对象。与我通过 id 访问工作表集合的方式相同,我的想法是通过 id 访问每个工作表中的表列表集合。 在 read_excel(file, skiprows=n) 中有技能行而不是 skipcols 也很奇怪 您必须编写一个自定义函数来迭代每个工作表或每个文件以查找标题开始的位置,然后将这些参数传递给 pandas 有什么办法可以跳过列吗? 【参考方案1】:

这是一种解析一个表的方法,但是需要您了解解析的seet的一些信息。

df = pd.read_excel("file.xlsx", usecols="B:I", index_col=3)
print(df)

不优雅且仅当工作表中存在一个表时才有效,但第一步:

import pandas as pd
import string

letter = list(string.ascii_uppercase)

df1 = pd.read_excel("file.xlsx")

def get_start_column(df):
    for i, column in enumerate(df.columns):
        if df[column].first_valid_index():
            return letter[i]

def get_last_column(df):
    columns = df.columns
    len_column = len(columns)
    for i, column in enumerate(columns):
        if df[column].first_valid_index():
            return letter[len_column - i]

def get_first_row(df):
    for index, row in df.iterrows():
        if not row.isnull().values.all():
            return index + 1

def usecols(df):
    start = get_start_column(df)
    end = get_last_column(df)
    return f"start:end"

df = pd.read_excel("file.xlsx",  usecols=usecols(df1), header=get_first_row(df1)) 
print(df)

【讨论】:

啊,弗洛里安,太好了,我们在另一个问题中见过面。谢谢。假设您不知道 Listobject 的位置。 (其实我不想打开excel文件来查看)。我想查看表格(列表对象)。 不错,如果 excel 文件很小,我想这没关系,但我只会将前 50 行读入函数以提高性能【参考方案2】:

我知道这个问题已经被标记为已解决,但我发现一篇文章提供了更强大的解决方案: Full Post

我想这个库的更新版本支持更好地了解工作簿结构。总结如下:

    使用来自openpyxlload_workbook 函数加载工作簿 然后,您可以访问其中的工作表,其中包含 Excel 中的列表对象(表格)集合。 一旦您获得对表的访问权限,就可以访问这些表的范围地址。 最后,他们遍历范围并从中创建一个 pandas 数据框。

这是一个更好的解决方案,因为它使我们能够遍历工作簿中的所有工作表和表格。

【讨论】:

以上是关于用熊猫将Excel工作表(Listobject)读入python的主要内容,如果未能解决你的问题,请参考以下文章

SQL中的Excel ListObject(格式为表格)

如何在没有任何数据行的 Excel 表/ListObject 中读取计算列的公式

ListObject.Querytable 的 QueryTable_AfterRefresh 在 Excel 2016 中不起作用

.NET - Excel ListObject 在数据绑定上自动调整大小

通过标题名称而不是列索引引用 VSTO Excel ListObject 的列

熊猫:将特定的 Excel 单元格值读入变量