You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:06:01