如何在读取数据时处理空白页

时间:2018-01-23 14:05:36

标签: python pandas

我正在读取一个excel文件,但是当一张工作表为空或工作表在A1中只包含类似“空”的字符串时,它会抛出一个异常

AttributeError: 'Series' object has no attribute 'iterrows'

以下是我正在使用的代码

df = pd.read_excel(excel_file, header=None, squeeze=True, sheet_name=sheet_name)
for i, row in df.iterrows():
    if row.notnull().all():
        data = df.iloc[(i+1):].reset_index(drop=True)
        data.columns = pd.Series(list(df.iloc[i])).str.replace(' ','_')
        break

for c in data.columns:
    data[c] = pd.to_numeric(data[c], errors='ignore')

2 个答案:

答案 0 :(得分:1)

我不确定这是多么pythonic,但你可以在迭代行之前显式地将Series转换为DataFrame

df = DataFrame(pd.read_excel(excel_file, header=None, squeeze=True, sheet_name=sheet_name))

如果read_excel返回Series,则DataFrame()来电仍会返回DataFrame。我还建议添加一个条件。例如,如果您的df至少需要两列和一行,则可以使用:

if Len(df.columns) >= 2 and len(df) >= 1:
    for i, row in df.iterrows():
        if row.notnull().all():
            data = df.iloc[(i+1):].reset_index(drop=True)
            data.columns = pd.Series(list(df.iloc[i])).str.replace(' ','_')
            break

这将阻止它在df未达到预期的情况下尝试迭代行(并修改df)。在处理和返回df之前,应该在代码中内置这样的内容,这样可以降低引入错误数据的风险。

答案 1 :(得分:0)

如果你的df是空的,那么试图迭代它是没有意义的。

您可以使用返回df.emptyTrue的{​​{1}}来检查数据帧是否为空,然后再进行迭代

编辑:通常如果一张工作表在A1处包含“空”,它仍然会导致一个带有“空”字符串的pandas系列