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
相关产品推荐
相关产品推荐

