API返回JSON嵌套字段GroupBY频率统计报错排查求助
解决嵌套JSON字段的频率统计问题
你遇到的问题核心在于:outcome_status列中的每个元素是字典对象(或者空值),而不是DataFrame的顶级列。直接对这个Series调用groupby('category')会报错,因为category是字典内部的键,不是DataFrame的列名。
为什么之前的尝试没用?
你删除空值、重置索引后,df_outcome依然是一个由字典组成的Series,而不是包含category列的DataFrame。所以groupby('category')找不到对应的列,自然抛出KeyError。
两种可行的解决方案
方案1:提取嵌套字段生成新列后统计
最直接的方式是用apply从每个outcome_status字典中提取category值,生成一个新列,再进行分组统计:
import pandas as pd import numpy as np import requests # 你的API调用代码(保持不变) lat_coord = 51.767538 long_coord = -1.497488 lat_upper = str(lat_coord + 0.02) lat_lower = str(lat_coord - 0.02) long_upper = str(long_coord + 0.02) long_lower = str(long_coord - 0.02) api_call="https://data.police.uk/api/crimes-street/all-crime?poly=" + lat_lower + "," + long_upper + ":" + lat_lower + "," + long_lower + ":" + lat_upper + "," + long_lower + ":" + lat_upper + "," + long_upper + "&date=2017-01" request_resp=requests.get(api_call).json() df_resp = pd.DataFrame(request_resp) # 提取嵌套的category字段 df_resp['outcome_category'] = df_resp['outcome_status'].apply( lambda x: x['category'] if pd.notna(x) else np.nan ) # 统计频率(自动忽略空值) outcome_freq = df_resp.groupby('outcome_category').size() print(outcome_freq)
方案2:展开嵌套字典为DataFrame后合并统计
如果outcome_status里还有其他需要用到的字段,推荐用pd.json_normalize把字典展开成完整的DataFrame,再和原数据合并:
# 展开非空的outcome_status字典,保留原索引 outcome_df = pd.json_normalize(df_resp['outcome_status'].dropna()).set_index( df_resp['outcome_status'].dropna().index ) # 合并到原DataFrame merged_df = df_resp.join(outcome_df) # 统计嵌套category的频率 outcome_freq = merged_df.groupby('category').size() print(outcome_freq)
补充说明
- 方案1更轻量,适合只需要提取单个嵌套字段的场景;
- 方案2适合需要处理嵌套字典中多个字段的场景,能完整保留所有嵌套信息。
内容的提问来源于stack exchange,提问作者Stuart Kirkup
相关产品推荐
相关产品推荐

