使用Python Pandas动态跳过Excel中的空行。

3
我正在使用Python中的Pandas读取Excel文件的多个工作表。 我有三种情况:
  1. 一些工作表从第1行开始包含数据
osht=pd.DataFrame(filename+sheetname)

delimited table Example: 
Country;Company;Product
US;ABC;XYZ
US;ABD;XYY
  1. 有些表格前面有n个空行,而有些表格则有摘要信息。 我知道可以使用skip_blank来去除顶部的空白行,但是顶部的空白行数量不是固定的,可能是3或4或8。
delimited table Example: 
;;
;;
;;
Country;Company;Product
US;ABC;XYZ
US;ABD;XYY
  1. 我正在尝试阅读所有这些表格,但不确定如何做到 -有没有办法弄清楚从第三行摘要结束到第四行是我的表头,第一列标题是“国家”
delimited table Example: 

Product summary table for East region;;
Date: 1st Sep, 2016;;
;;
Country;Company;Product
US;ABC;XYZ
US;ABD;XYY

你是否考虑过对Excel工作簿进行重新调整?使用Python模块加载它以处理Excel,消除发现的空行,并使用Excel模块将其写回到原始或新的Excel工作簿中。我相信这是你最好的选择。 - Thom Ives
2
如果您提供数据示例,问题将会更好。摘要是什么样子的?它需要多少列和行?如何区分摘要和列标题? - David Dale
怎么样,把所有的空行都删除掉呢?可以使用df.dropna()函数。 - DJK
感谢@djk47463的输入,但是,如果我加载了所有带有顶部空行的数据并使用dropna(),那么有没有办法将实际标题分配回数据?而且我需要通用脚本,可以在所有三种情况下工作。 - Rajesh Mhatre
@DavidDale 我已经提供了示例表格。 - Rajesh Mhatre
@ThomIves,你能提供一些重写Excel的例子吗?另外,由于文件大小约为60MB,这样做会降低性能吗? - Rajesh Mhatre
1个回答

6
我建议使用以下算法:
  1. 读取整张表格
  2. 将第一行没有缺失值的行作为表头
  3. 删除表头以上的所有行
这段代码对我来说运行良好:
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

谢谢 @David,非常好的解决方案。 - Rajesh Mhatre
谢谢@David,非常好的解决方案。它准确地读取文件标题,但是在附加上述代码后,我的先前代码不起作用了,在读取数据后,它会根据数据类型从数据框中删除一些列,例如我保留数字列,下面的行无法识别数字列,它对数字列也返回false [head for head in df.columns.tolist() if head not in custom_col_list and not np.issubdtype(df[head].dtype, np.number) ] - Rajesh Mhatre
@RajeshMhatre,你可以循环遍历每一列并尝试将其转换为数字(如果可能的话)。我已经将这个添加到我的答案中了。 - David Dale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接