Python处理BCRA PDF表格报错:merge仅支持Series/DataFrame,传入NoneType
PDF月度数据提取报错解决方案
根因分析
报错核心原因是provincias函数处理偶数页时存在逻辑缺陷:偶数页处理分支的return语句仅嵌套在「表格列数>17」的判断块内,当处理的偶数页所有表格列数都≤17时,函数走完所有逻辑后没有显式返回值,默认返回None,导致merge操作时传入了非DataFrame类型的参数。
同时原函数还存在另外两个隐藏逻辑问题:
- 处理奇数页时,遍历到第一个奇数页就直接返回,
pages参数传入的后续页码不会被处理 - 偶数页处理的
return语句嵌套在表格遍历循环内,仅会处理第一个符合列数>17的表格,剩余表格会被忽略 - pandas高版本中
append方法已被废弃,运行时会触发警告
修复方案
调整代码缩进修正返回逻辑,同时优化页码遍历、表格拼接的逻辑,修复后的代码如下:
import pandas as pd # 注意提前导入read_pdf对应的依赖,比如tabula的read_pdf def provincias(codigo,pages:list): box = [4,2.8,19,27] fc = 28.28 for i in range(0, len(box)): box[i] *= fc path = "http://www.bcra.gob.ar/Pdfs/PublicacionesEstadisticas/BoletinEstadistico/" + 'boldat' + str(codigo) +".pdf" tables = read_pdf(path, pages=pages, area=[box], stream=True) # 按页码奇偶分开处理所有表格 tablas1 = pd.DataFrame() # 奇数页结果 tablas2 = pd.DataFrame() # 偶数页结果 for idx, page in enumerate(pages): current_table = tables[idx] if page % 2 != 0: # 处理奇数页 current_table = current_table.drop(columns=['(6)(7)','Unnamed: 1','Unnamed: 2','Unnamed: 4']) current_table = current_table.rename(columns={'Unnamed: 0':'Actividad','Unnamed: 3':'Capital Federal','Aires':'Gran Buenos Aires','Unnamed: 5':'Resto Bs As', 'Unnamed: 6':'Catamarca','Unnamed: 7':'Cordoba','Unnamed: 8':'Corrientes','Unnamed: 9':'Chaco','Unnamed: 10':'Chubut', 'Unnamed: 11':'Entre Rios','Unnamed: 12':'Formosa','Unnamed: 13':'Jujuy'}) tablas1 = pd.concat([tablas1, current_table], ignore_index=True) else: # 处理偶数页 if len(current_table.columns) <= 17: current_table = current_table.drop(columns=['(6)(7)','Unnamed: 1']) current_table = current_table.rename(columns={'Unnamed: 0':'Actividad','Unnamed: 2':'La Pampa','Unnamed: 3':'La Rioja','Unnamed: 4':'Mendoza', 'Unnamed: 5':'Misiones','Unnamed: 6':'Neuquen','Unnamed: 7':'Rio Negro','Unnamed: 8':'Salta', 'Unnamed: 9':'San Juan','Unnamed: 10':'San Luis','Unnamed: 11':'Santa Cruz','Unnamed: 12':'Santa Fe', 'Estero':'Santiago del Estero','Fuego':'Tierra del Fuego','Unnamed: 13':'Tucuman'}) else: current_table = current_table.drop(columns=['(6)(7)','Unnamed: 1','Unnamed: 13']) current_table = current_table.rename(columns={'Unnamed: 0':'Actividad','Unnamed: 2':'La Pampa','Unnamed: 3':'La Rioja','Unnamed: 4':'Mendoza', 'Unnamed: 5':'Misiones','Unnamed: 6':'Neuquen','Unnamed: 7':'Rio Negro','Unnamed: 8':'Salta', 'Unnamed: 9':'San Juan','Unnamed: 10':'San Luis','Unnamed: 11':'Santa Cruz','Unnamed: 12':'Santa Fe', 'Estero':'Santiago del Estero','Fuego':'Tierra del Fuego','Unnamed: 14':'Tucuman'}) tablas2 = pd.concat([tablas2, current_table], ignore_index=True) # 按调用需求返回对应结果 if not tablas1.empty: tablas1['ID'] = range(len(tablas1)) return tablas1 else: tablas2 = tablas2.drop(columns=['Actividad']) tablas2['ID'] = range(len(tablas2)) return tablas2
验证步骤
修复完成后先单独执行以下代码确认返回值正常:
# 验证偶数页调用是否返回DataFrame res_even = provincias(202106, pages=[314,316]) print(type(res_even)) # 输出应为<class 'pandas.core.frame.DataFrame'> # 再执行原合并逻辑 junio2021 = provincias(202106, pages=[313,315]).merge(res_even, how='left', on='ID').drop(columns=['ID'])
内容的提问来源于stack exchange,提问作者Juan Benitez
相关产品推荐
相关产品推荐

