如何展开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
相关产品推荐
相关产品推荐

