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

Python通过API获取数据构建DataFrame时因字段缺失引发KeyError及try-except语法错误的解决方法

解决API返回JSON字段缺失导致的KeyError问题

你遇到的语法错误是因为try-except语句不能直接嵌入列表的元素定义中,Python的语法不允许这种写法。下面给你几种简洁且正确的实现方式,帮你处理字段缺失的情况:

方法1:使用字典的get()方法(推荐)

字典的get()方法是处理缺失键最便捷的方式,它允许你指定一个默认值,当键不存在时就返回这个默认值,完全不需要异常捕获:

import pandas as pd
import numpy as np

response = r.json()
cols = ['realizationreport_id', 'suppliercontract_code', 'rid', 'ppvz_inn', 'ppvz_supplier_name']
l = []
for entry in response:
    l.append([
        entry['realizationreport_id'],  # 假设这些字段一定存在,如果也可能缺失,同样用get()
        entry['suppliercontract_code'],
        entry['rid'],
        entry.get('ppvz_inn', np.nan),  # 缺失时填充NaN,适合数值型字段
        entry.get('ppvz_supplier_name', '0')  # 缺失时填充'0',适合字符串型字段
    ])

df = pd.DataFrame(l, columns=cols)

如果某些你认为的必填字段也可能缺失,同样可以用get()给它们加默认值,比如entry.get('realizationreport_id', np.nan)。

方法2:用try-except单独处理每个字段

如果你更倾向于用异常捕获的方式,可以把每个字段的获取逻辑单独拆分出来,避免语法错误:

import pandas as pd
import numpy as np

response = r.json()
cols = ['realizationreport_id', 'suppliercontract_code', 'rid', 'ppvz_inn', 'ppvz_supplier_name']
l = []
for entry in response:
    # 初始化每个字段的默认值
    report_id = entry['realizationreport_id']
    contract_code = entry['suppliercontract_code']
    rid_val = entry['rid']
    ppvz_inn = np.nan
    supplier_name = '0'
    
    # 处理可能缺失的字段
    try:
        ppvz_inn = entry['ppvz_inn']
    except KeyError:
        pass  # 保持默认值不变
    
    try:
        supplier_name = entry['ppvz_supplier_name']
    except KeyError:
        pass
    
    l.append([report_id, contract_code, rid_val, ppvz_inn, supplier_name])

df = pd.DataFrame(l, columns=cols)

这种方式代码量稍大,但逻辑更清晰,适合字段缺失规则复杂的场景。

方法3:直接用Pandas转换并填充(最高效)

其实你完全不需要手动循环构建列表,Pandas可以直接将JSON数组转换为DataFrame,然后统一填充缺失值,代码更简洁:

import pandas as pd
import numpy as np

response = r.json()
df = pd.DataFrame(response)

# 只保留需要的列,针对不同字段设置填充值
cols = ['realizationreport_id', 'suppliercontract_code', 'rid', 'ppvz_inn', 'ppvz_supplier_name']
df = df[cols].fillna({'ppvz_inn': np.nan, 'ppvz_supplier_name': '0'})

这种方法利用了Pandas的向量操作,比手动循环效率高很多,尤其是当数据量较大时优势明显。

总结一下,优先用get()方法或者直接Pandas转换填充,这两种方式代码简洁且易维护。

内容的提问来源于stack exchange,提问作者PankeyDie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:55:12