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

如何展开Pandas列中的嵌套字典?

问题:展开DataFrame中的嵌套字典列

我有一个DataFrame,其中某一列包含嵌套字典,原始数据如下:

ID dict
1  {Comp A: {Street: 123 Street}, Comp B: {Street: 456 Street}}
2  {Comp C: {Street: 749 Street}}
3  {Comp D: {Street: }}

我希望将该字典展开为如下结构的DataFrame:

ID  company_name  street
1   Comp A        123 Street
1   Comp B        456 Street
2   Comp C        749 Street
3   Comp D

我尝试了以下代码:

dft['dict'] = df.dict.apply(eval)
dft = dft.explode('dict')

这段代码能正确生成ID和company_name列,但还没找到展开street列的方法。

可复现的字典形式数据:

data = [{'ID': 1,   'entity_details': "{'comp a': {'street_address': '123 street'}}"},  
{'ID': 2,   'entity_details': "{'comp b': {'street_address': '456 street'}}"},{'ID': 3,   'entity_details': "{'comp c': {'street_address': '555 street'},'comp d': {'street_address': '585 street'}, 'comp e': {'street_address': '873 street'}}"},  
{'ID': 4,   'entity_details': "{'comp f': {'street_address': '898 street'}}"}]

解决方案

方法一:列表推导式(直观易读)

直接遍历每行数据和嵌套字典的键值对,整理成目标格式的列表后转成DataFrame,同时能处理空地址的情况:

import pandas as pd
import ast

# 加载数据
df = pd.DataFrame(data)

# 将字符串格式的字典转为实际字典对象(用ast.literal_eval更安全,避免恶意代码风险)
df['entity_details'] = df['entity_details'].apply(ast.literal_eval)

# 整理数据为目标格式
rows = []
for _, row in df.iterrows():
    comp_dict = row['entity_details']
    for comp_name, addr_info in comp_dict.items():
        rows.append({
            'ID': row['ID'],
            'company_name': comp_name,
            'street': addr_info['street_address'] or None  # 空地址转为None,显示为空
        })

# 生成最终DataFrame
final_df = pd.DataFrame(rows)

方法二:结合explode和apply(利用Pandas内置方法)

如果更倾向于用Pandas的链式操作,可以这样写:

import pandas as pd
import ast

df = pd.DataFrame(data)
df['entity_details'] = df['entity_details'].apply(ast.literal_eval)

# 先将每个嵌套字典转为键值对列表,再展开
df['company_info'] = df['entity_details'].apply(lambda x: list(x.items()))
df_expanded = df.explode('company_info', ignore_index=True)

# 拆分公司名和地址
df_expanded[['company_name', 'street_info']] = pd.DataFrame(df_expanded['company_info'].tolist(), index=df_expanded.index)
df_expanded['street'] = df_expanded['street_info'].apply(lambda x: x['street_address'] or None)

# 保留需要的列
final_df = df_expanded[['ID', 'company_name', 'street']]

结果示例

运行上述代码后,得到的final_df结构如下:

ID company_name      street
0   1       comp a  123 street
1   2       comp b  456 street
2   3       comp c  555 street
3   3       comp d  585 street
4   3       comp e  873 street
5   4       comp f  898 street

如果原始数据中存在空地址(比如{'comp g': {'street_address': ''}}),代码会自动将street列转为空值,符合需求。


内容的提问来源于stack exchange,提问作者Mek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:30:57