
本文介绍两种高效方法,将含分类、国家代码、州代码和计数的dataframe,转换为按category→countrycode→statecode三级嵌套的字典(json兼容结构),适用于api响应或前端数据组织场景。
本文介绍两种高效方法,将含分类、国家代码、州代码和计数的dataframe,转换为按category→countrycode→statecode三级嵌套的字典(json兼容结构),适用于api响应或前端数据组织场景。
在数据分析与Web服务开发中,常需将扁平化的表格数据(如Pandas DataFrame)重构为层级清晰的嵌套结构,便于序列化为JSON并供前端消费。本文以一个典型示例出发:原始DataFrame包含category(类别)、countrycode(国家码)、stateCode(州码)和statecount(数量)四列,目标是生成形如 {"Medical": {"US": {"AK": 600}, "CAN": {"AB": 100}}, ...} 的三层嵌套字典。
最推荐的方法是使用 df.groupby(['category', 'countrycode']) 进行双重分组,配合 setdefault 动态构建嵌套字典:
import pandas as pd
data = {
'category': ['Medical','Medical','Research','Medical','Research'],
'countrycode': ['US','CAN','US','CAN','US'],
'stateCode': ['AK','AB','MO','NT','OK'],
'statecount': [600,100,200,760,90]
}
df = pd.DataFrame(data)
# ✅ 推荐:高效、可读性强、内存友好
out = {}
for (cat, country), group in df.groupby(['category', 'countrycode']):
out.setdefault(cat, {})[country] = group.set_index('stateCode')['statecount'].to_dict()
print(out)
# 输出:
# {'Medical': {'US': {'AK': 600}, 'CAN': {'AB': 100, 'NT': 760}},
# 'Research': {'US': {'MO': 200, 'OK': 90}}}该方案核心在于:
- groupby(['category', 'countrycode']) 一次性获取两级键组合;
- setdefault(cat, {}) 确保外层字典存在对应 category 键(避免KeyError);
- group.set_index('stateCode')['statecount'].to_dict() 将当前子组快速转为 {'stateCode': statecount} 映射。
若追求函数式风格或需更高灵活性(例如后续扩展聚合逻辑),也可采用字典推导式写法:
# ⚠️ 注意:此方式对大数据集性能略低(重复分组)
nested = {
cat: {
cntry: grp.set_index('stateCode')['statecount'].to_dict()
for cntry, grp in sub_df.groupby('countrycode')
}
for cat, sub_df in df.groupby('category')
}注意事项:
- 原始数据中 'Medical' 类别下 'US' 的 'OK' 实际未出现(问题示例输出有误),正确结果应仅包含实际存在的 (category, countrycode, stateCode) 组合;
- 若需输出标准JSON字符串,直接调用 json.dumps(out, indent=2) 即可;
- 所有键名(如 'Medical', 'US')均来自原始数据,确保其唯一性与规范性,否则可能引发意外覆盖;
- 如遇缺失值,建议预先用 df.dropna(subset=['category','countrycode','stateCode']) 清洗,避免空键异常。
掌握这种分组+字典构建模式,可轻松扩展至四层甚至更深嵌套(如增加 city 维度),是Pandas数据重塑中的实用范式。


















