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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:23:43