嵌套字典转DataFrame时遇语法错误?求解决方案
解决嵌套字典转DataFrame时的
TypeError: unhashable type: 'dict'问题 问题原因
报错TypeError: unhashable type: 'dict'通常是因为嵌套字典中存在字典作为键,或是展开字典时误将子字典当作可迭代键值对处理,而DataFrame无法直接解析不可哈希的字典类型。
解决方案
以下针对两种常见的特殊嵌套结构给出对应处理方法:
情况1:多层嵌套字典(值为子字典)
假设你的示例字典结构如下:
sample_dict = { "user1": {"name": "Alice", "age": 25, "contact": {"email": "alice@test.com", "phone": "12345"}}, "user2": {"name": "Bob", "age": 30, "contact": {"email": "bob@test.com"}} }
之前尝试的直接转换代码(如pd.DataFrame(sample_dict))会报错,可通过递归展开字典为扁平结构解决:
import pandas as pd def flatten_nested_dict(d, parent_key="", sep="_"): flattened_items = [] for key, value in d.items(): combined_key = f"{parent_key}{sep}{key}" if parent_key else key if isinstance(value, dict): flattened_items.extend(flatten_nested_dict(value, combined_key, sep).items()) else: flattened_items.append((combined_key, value)) return dict(flattened_items) # 逐个展开子字典并整理为列表 flattened_data = [flatten_nested_dict(user_data) for user_data in sample_dict.values()] # 转换为DataFrame df = pd.DataFrame(flattened_data, index=sample_dict.keys())
最终得到的DataFrame格式:
| name | age | contact_email | contact_phone | |
|---|---|---|---|---|
| user1 | Alice | 25 | alice@test.com | 12345 |
| user2 | Bob | 30 | bob@test.com | NaN |
情况2:字典作为键的特殊结构
如果你的字典存在字典作为键的情况(如{ {"id": 1}: {"score": 90} }),需先将字典键转换为可哈希类型(如字符串或元组):
import pandas as pd def normalize_dict_keys(d): normalized = {} for key, value in d.items(): # 将字典键转为字符串 new_key = str(key) if isinstance(key, dict) else key # 递归处理值中的嵌套字典 if isinstance(value, dict): normalized[new_key] = normalize_dict_keys(value) else: normalized[new_key] = value return normalized # 处理字典键 processed_dict = normalize_dict_keys(your_target_dict) # 转换为DataFrame df = pd.DataFrame.from_dict(processed_dict, orient="index").reset_index().rename(columns={"index": "original_key"})
自定义结构适配
如果上述方案不符合你的实际字典结构,可提供具体的示例字典和期望的DataFrame格式,能给出更精准的转换代码。
内容的提问来源于stack exchange,提问作者prayner
相关产品推荐
相关产品推荐

