动态跳过python中excel的顶部空白行

动态跳过python中excel的顶部空白行,python,excel,pandas,Python,Excel,Pandas,我正在使用python中的pandas读取excel文件的多张表格。 我有三个箱子 某些工作表包含来自第1行的数据 有些表格前有n个空行,有些表格有摘要 我知道使用skip_blank可以去掉顶部空白行,但顶部空白行的数量本质上不是固定的,可能是3、4或8 第一列中的表格我正在尝试阅读所有这些表格,但不确定如何阅读 -有没有办法确定从第三行摘要结束,第四行是我的表格标题,第一列标题是“国家” 我将提出以下算法: 读整张桌子 考虑不包含缺失值的第一行作为标题 删除标题上方的所有行 这段代码对我来说

我正在使用python中的pandas读取excel文件的多张表格。 我有三个箱子

某些工作表包含来自第1行的数据 有些表格前有n个空行,有些表格有摘要 我知道使用skip_blank可以去掉顶部空白行,但顶部空白行的数量本质上不是固定的,可能是3、4或8 第一列中的表格我正在尝试阅读所有这些表格,但不确定如何阅读 -有没有办法确定从第三行摘要结束,第四行是我的表格标题,第一列标题是“国家”
我将提出以下算法:

读整张桌子 考虑不包含缺失值的第一行作为标题 删除标题上方的所有行 这段代码对我来说没问题:

import pandas as pd
for sheet in range(3):
    raw_data = pd.read_excel('blank_rows.xlsx', sheetname=sheet, header=None)
    print(raw_data)
    # looking for the header row
    for i, row in raw_data.iterrows():
        if row.notnull().all():
            data = raw_data.iloc[(i+1):].reset_index(drop=True)
            data.columns = list(raw_data.iloc[i])
            break
    # transforming columns to numeric where possible
    for c in data.columns:
        data[c] = pd.to_numeric(data[c], errors='ignore')
    print(data)
根据您的示例,它使用。从原始数据帧

         0        1        2
0  Country  Company  Product
1       US      ABC      XYZ
2       US      ABD      XYY

         0        1        2
0      NaN      NaN      NaN
1      NaN      NaN      NaN
2      NaN      NaN      NaN
3  Country  Company  Product
4       US      ABC      XYZ
5       US      ABD      XYY

                                       0        1        2
0  Product summary table for East region      NaN      NaN
1                    Date: 1st Sep, 2016      NaN      NaN
2                                    NaN      NaN      NaN
3                                Country  Company  Product
4                                     US      ABC      XYZ
5                                     US      ABD      XYY
该脚本生成相同的表

  Country Company Product
0      US     ABC     XYZ
1      US     ABD     XYY

我将提出以下算法:

读整张桌子 考虑不包含缺失值的第一行作为标题 删除标题上方的所有行 这段代码对我来说没问题:

import pandas as pd
for sheet in range(3):
    raw_data = pd.read_excel('blank_rows.xlsx', sheetname=sheet, header=None)
    print(raw_data)
    # looking for the header row
    for i, row in raw_data.iterrows():
        if row.notnull().all():
            data = raw_data.iloc[(i+1):].reset_index(drop=True)
            data.columns = list(raw_data.iloc[i])
            break
    # transforming columns to numeric where possible
    for c in data.columns:
        data[c] = pd.to_numeric(data[c], errors='ignore')
    print(data)
根据您的示例,它使用。从原始数据帧

         0        1        2
0  Country  Company  Product
1       US      ABC      XYZ
2       US      ABD      XYY

         0        1        2
0      NaN      NaN      NaN
1      NaN      NaN      NaN
2      NaN      NaN      NaN
3  Country  Company  Product
4       US      ABC      XYZ
5       US      ABD      XYY

                                       0        1        2
0  Product summary table for East region      NaN      NaN
1                    Date: 1st Sep, 2016      NaN      NaN
2                                    NaN      NaN      NaN
3                                Country  Company  Product
4                                     US      ABC      XYZ
5                                     US      ABD      XYY
该脚本生成相同的表

  Country Company Product
0      US     ABC     XYZ
1      US     ABD     XYY

您是否考虑过重新调整excel工作簿?使用用于处理excel的python模块加载它,消除找到的空白行,并使用用于编写excel工作簿的excel模块将其写回新excel工作簿的相同位置。我相信这是你最好的选择。如果你提供一个数据示例,问题会得到改进。摘要是什么样子的?需要多少列和行?如何区分摘要和列标题?删除所有空行df.dropnaThanks,@djk47463进行输入如何?但是,如果我加载所有具有顶部空行的数据并使用dropna,那么有没有办法将实际标题分配回数据?我需要一个通用的脚本,它可以处理这三个问题scenarios@DavidDale我提供了示例表,您是否考虑过重新调整excel工作簿?使用用于处理excel的python模块加载它,消除找到的空白行,并使用用于编写excel工作簿的excel模块将其写回新excel工作簿的相同位置。我相信这是你最好的选择。如果你提供一个数据示例,问题会得到改进。摘要是什么样子的?需要多少列和行?如何区分摘要和列标题?删除所有空行df.dropnaThanks,@djk47463进行输入如何?但是,如果我加载所有具有顶部空行的数据并使用dropna,那么有没有办法将实际标题分配回数据?我需要一个通用的脚本,它可以处理这三个问题scenarios@DavidDale我已经提供了示例,谢谢@David,伟大的解决方案。谢谢@David,伟大的解决方案。它读取的文件标题是准确的,但在附加上述代码后,我以前的代码如何不起作用,在读取数据后,它根据数据类型从数据框中删除一些列,例如我保留数字列,而行下并没有标识数字列,它也为数字列提供了false[head for head in df.columns.tolist,如果head不在自定义列中且不是np.issubdtypedf[head].dtype,np.number]@RajeshMhatre,如果可能的话,你可以在列上循环,并尝试将每个列转换为数字。我将此添加到我的答案中。感谢@David,伟大的解决方案。感谢@David,伟大的解决方案。它读取文件标题准确,但我以前的代码在附加上述代码后,在读取数据后无法工作。它从d中删除了一些列基于数据类型的ata帧,如我保留数字列,而第行下方未标识数字列,它也会为数字列提供false[如果头不在自定义列列表中,则为head for head in df.columns.tolist,而不是np.issubdtypedf[head].dtype,np.number]@RajeshMhatre,如果可能的话,你可以在列上循环并尝试将每个列转换为数字。我把这个添加到了我的答案中。