【问题标题】:Parse multiple tables of different sizes from a single csv file从单个 csv 文件中解析多个不同大小的表
【发布时间】:2021-09-11 01:46:13
【问题描述】:

我有一个包含多个表的 CSV 文件。每个表都有一个标题,以及可变数量的行和列(这些数字可能因文件而异)。标题以及行和列的名称也可能在我将来需要解析的不同文件之间发生变化,因此我无法对它们进行硬编码。某些列也可能包含空单元格。

以下是具有此结构的示例 CSV 文件的屏幕截图:

我需要找到一种解决方案,将 CSV 中的所有表格解析为 Pandas DF。理想情况下,最终输出将是一个 Excel 文件,其中每个表格都保存为一个工作表,每个工作表的名称将是相应的表格标题。

我尝试了建议的解决方案in this post,但始终无法识别表格的开始/结束。当我使用输入 csv 文件的更简单版本时,建议的代码只返回一个表。

我将不胜感激!

【问题讨论】:

  • 如果表格被空行分隔,您可以检查您处理的每一行是否为空。一旦一行为空,您就可以开始处理下一个表
  • 谢谢@AlexandruCristiean!您能否分享一个基本的代码示例来为我指明正确的方向?

标签: python excel pandas csv parsing


【解决方案1】:

你可以试试这个:

df = pd.read_csv("file.csv")

dfs = []
start = 0
for i, row in df.iterrows():
    if all(row.isna()):  # Empty row
        # Remove empty columns
        temp_df = df.loc[start:i, :].dropna(how="all", axis=1)
        if start:  # Grab header, except for first df
            new_header = temp_df.iloc[0]
            temp_df = temp_df[1:]
            temp_df.columns = new_header
        temp_df = temp_df.dropna(how="all", axis=0)
        dfs.append(temp_df)
        start = i + 1

然后,您可以通过调用dfs[0]dfs[1]、...来访问每个df。

【讨论】:

  • 谢谢@Laurent!有几个问题是: 1. 代码不会读取 csv 文件中的最后一个表。 2. 它为每个表添加了一个额外的空白行。
  • 再次感谢!删除多余的空白行效果很好!但是,我无法解析最后一个表。我查了一下,没有多余的空白行。有趣的是,如果我在最后一个表之后添加一个空白行和一个虚拟数据行,脚本将读取该表并忽略虚拟数据行。
  • 我也想知道,你为什么要添加丢弃第一个表的部分?有必要吗?应该如何修改代码以解析第一个表?
  • 当我以当前形式尝试时,代码不会将第一个 df 保存到 dfs 列表中。
  • 确实,抱歉,dfs.append(temp_df) 没有正确缩进,请参阅我的更新答案。
猜你喜欢
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2019-06-17
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
相关资源
最近更新 更多