Pandas嵌套DataFrame扁平化处理:适配institutes为None场景
嵌套字典DataFrame扁平展开(适配client.institutes为None场景)
可复现输入数据
import pandas as pd data = { 'contact': [{'email': 'a@test.com', 'phone': '12345'}, {'email': 'b@test.com', 'phone': '67890'}], 'profile': [{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 28}], 'client': [{'id': 'C001', 'institutes': [{'inst_id': 'I001', 'name': 'Inst A'}, {'inst_id': 'I002', 'name': 'Inst B'}]}, {'id': 'C002', 'institutes': None}] } df = pd.DataFrame(data)
预期扁平输出
| phone | name | age | client_id | inst_id | inst_name | |
|---|---|---|---|---|---|---|
| a@test.com | 12345 | Alice | 30 | C001 | I001 | Inst A |
| a@test.com | 12345 | Alice | 30 | C001 | I002 | Inst B |
| b@test.com | 67890 | Bob | 28 | C002 | NaN | NaN |
解决方案代码
import pandas as pd # 1. 展开contact和profile的嵌套字典为独立列 df_contact = df['contact'].apply(pd.Series) df_profile = df['profile'].apply(pd.Series) df_combined = pd.concat([df_contact, df_profile, df['client']], axis=1) # 2. 处理client.institutes为None的情况:替换为空列表,避免explode时丢失行 df_combined['client'] = df_combined['client'].apply( lambda x: {**x, 'institutes': x['institutes'] if x['institutes'] is not None else []} ) # 3. 提取client.id并拆分institutes字段,执行explode展开列表 df_combined['client_id'] = df_combined['client'].map(lambda x: x['id']) df_combined['institutes'] = df_combined['client'].map(lambda x: x['institutes']) df_exploded = df_combined.explode('institutes', ignore_index=True) # 4. 展开institutes的嵌套字典为独立列,并重命名区分 df_inst = df_exploded['institutes'].apply(pd.Series).rename(columns={'name': 'inst_name'}) # 5. 合并所有列,清理冗余原列 final_df = pd.concat( [df_exploded.drop(['contact', 'profile', 'client', 'institutes'], axis=1), df_inst], axis=1 ) print(final_df)
关键说明
- 核心修复点:将
client.institutes为None的场景替换为空列表[],这样explode操作不会直接丢弃该行,而是保留后让对应的机构字段显示为NaN,适配业务需求。 - 分步展开:先处理顶层的
contact/profile,再单独处理client的嵌套结构,避免多层嵌套展开时的字段冲突。
内容的提问来源于stack exchange,提问作者Surbhi
相关产品推荐
相关产品推荐

