Python遍历含同名键的JSON提取指定字段报错及实现方法
解决JSON嵌套数据提取与"unhashable type: 'dict'"错误问题
问题分析
你遇到的错误是因为处理嵌套字典/数组时,将不可哈希的字典对象用于了pandas要求可哈希的操作场景(比如列名、索引,或错误的展开逻辑)。要实现每个results对象对应description数量的记录,核心是把嵌套数组扁平化,让上层字段和数组内的每个元素一一配对。
解决方案
方法1:手动遍历生成扁平化记录
这种方式灵活性高,适配复杂嵌套结构:
import pandas as pd import json # 加载JSON数据(根据实际来源调整,比如从API响应获取) with open('your_data.json', 'r') as f: raw_data = json.load(f) flat_records = [] # 遍历每个results对象 for item in raw_data['results']: # 提取固定字段 base_info = { 'expenses': item.get('expenses'), 'dt_posted': item.get('dt_posted') } # 遍历lobbying_activities数组,生成对应记录 for activity in item.get('lobbying_activities', []): record = base_info.copy() record['description'] = activity.get('description') flat_records.append(record) # 转换为目标数据集 final_df = pd.DataFrame(flat_records)
方法2:用pandas.json_normalize快速处理
pandas内置的json_normalize专门用于嵌套JSON的扁平化,代码更简洁:
import pandas as pd import json # 加载JSON数据 with open('your_data.json', 'r') as f: raw_data = json.load(f) # 直接展开嵌套数组并关联上层字段 final_df = pd.json_normalize( raw_data['results'], record_path='lobbying_activities', # 指定要展开的数组路径 meta=['expenses', 'dt_posted'], # 指定要保留的上层字段 record_prefix='activity_' # 数组内字段的前缀(可选) ) # 按需重命名description列 final_df = final_df.rename(columns={'activity_description': 'description'})
关键说明
- 两种方法都会生成每条记录对应一个
description的数据集,完全匹配需求。 - 避免错误的核心是不要直接将嵌套字典/数组作为pandas的列值或索引,先将结构扁平化,确保每个字段都是字符串、数字这类可哈希的基础类型。
内容的提问来源于stack exchange,提问作者kiestuthridge23
相关产品推荐
相关产品推荐

