gpt4 book ai didi

python - 如何从包含许多表的 Excel 工作表中解析数据框(使用 Python,可能是 Pandas)

转载 作者:太空宇宙 更新时间:2023-11-03 15:58:19 26 4
gpt4 key购买 nike

我正在处理布局不当的 Excel 工作表,我正在尝试解析这些工作表并将其写入数据库。

每个工作表可以有多个表。虽然这些可能的表格的标题是已知的,但在任何给定的工作表上都不知道哪些表格,它们在工作表上的确切位置也不是(表格不以一致的方式对齐)。我添加了两种可能的工作表布局的图片来说明这一点:This layout有两个表,而 this one有第一张的所有 table ,但不在同一个位置,还有一张额外的 table 。

我所知道的:

  1. 所有可能的表格标题,因此每个单独的表格都可以通过其标题来识别
  2. 表格由空白单元格分隔。他们彼此不接触。

我的问题有没有一种干净的方法可以使用一些 Python 模块(例如 pandas)来处理这个问题?

我目前的做法:

我目前正在转换为 .csv 并解析每一行。我将每一行拆分为空白单元格,并处理该行的第一部分(应该属于最左边的表格)。该行的其余部分排队,稍后以相同的方式处理。然后我阅读了这个 first_part 并检查它是否是标题行。如果是,我用它来识别我正在处理的表(它存储在全局 current_df 中)。不是标题行的后续行被送入此表(这里我为我的表使用 pandas.DataFrame)。

到目前为止的代码如下(大部分不完整且未经测试,但它应该传达上述方法):

class DFManager(object): # keeps track of current table and its headers
current_df = None
current_headers = []

def set_current_df(self, df, headers):
self.current_headers = headers
self.current_df = df


def split_row(row, separator):
while row and row[0] == separator:
row.pop(0)
while row and row[-1] == separator:
row.pop()

if separator in row:
split_index = row.index(separator)
return row[:split_index], row[split_index:]
else:
return row, []


def process_df_row(row, dfmgr):
df = df_with_header(row) # returns the dataframe with these headers

if df is None: # is not a header row, add it to current df
df = dfmgr.current_df
add_row_to_df(row, df)
else:
dfmgr.set_current_df(df, row)


# this is passed the Excel sheet
def populate_dataframes(xl_sheet):
dfmgr = DFManager()
row_queue = Queue()
for row in xl_sheet:
row_queue.put(row)

for row in iter(row_queue.get, None):
if not row:
continue

first_part, remainder = split_row(row)
row_queue.put(remainder)

process_df_row(first_part, dfmgr)

最佳答案

这种情况非常特殊,可能没有“干净”的方法用现成的模块来做到这一点。

执行此操作的一种方法可能是使用您已经拥有的标题信息来查找每个表的起始索引,类似于此解决方案 (Python Pandas - Read csv file containing multiple tables),但在列方向上也有偏移。

确定每个表格的起始位置后,您需要确定宽度(先验已知或通过阅读直到下一个空白列发现)并将这些列读入数据框中直到表格末尾。

基于索引的方法比基于队列的方法的好处是您不需要重新发现分隔符在每行中的位置或跟踪哪些行片段属于哪个表。它也不知道每行是否存在 >2 个表。

关于python - 如何从包含许多表的 Excel 工作表中解析数据框(使用 Python,可能是 Pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41967814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com