我正在读取一个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')
答案 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.empty
或True
的{{1}}来检查数据帧是否为空,然后再进行迭代
编辑:通常如果一张工作表在A1处包含“空”,它仍然会导致一个带有“空”字符串的pandas系列