如何将嵌套字典展开为指定列的DataFrame?
将嵌套字典转换为指定列的DataFrame最优实现方式
我有如下嵌套字典,希望将其转换为包含iid、Invnum、@type、execId、CId、AId、df、type列的DataFrame,请问最优实现方式是什么?
data = {'A': {'B1': {'iid': 'B1', 'Invnum': {'B11': {'@type': '/test_data', 'execId': 42, 'CId': 42, 'AId': 'BAZ'}, 'B12': {'@type': '/test_data', 'CId': 8, 'AId': '123'}}}}, 'B2': {'iid': 'B2', 'Invnum': {'B21': {'@type': '/test_data', 'execId': 215, 'CId': 253,'df': [], 'type': 'F'}, 'B22': {'@type': '/test_data', 'execId': 10,'df': [], 'type': 'F'}}}} for key1 in data['A'].keys(): for key2 in data['A'][key1]['Invnum']: print(key1,key2)
预期输出如下:
最优实现思路
核心是迭代遍历嵌套字典的层级结构,把每个Invnum子项对应的所有字段收集成字典,最后统一转为DataFrame。这种方式逻辑清晰,能兼容字典里的缺失字段(自动填充NaN)。
代码实现
import pandas as pd data = {'A': {'B1': {'iid': 'B1', 'Invnum': {'B11': {'@type': '/test_data', 'execId': 42, 'CId': 42, 'AId': 'BAZ'}, 'B12': {'@type': '/test_data', 'CId': 8, 'AId': '123'}}}}, 'B2': {'iid': 'B2', 'Invnum': {'B21': {'@type': '/test_data', 'execId': 215, 'CId': 253,'df': [], 'type': 'F'}, 'B22': {'@type': '/test_data', 'execId': 10,'df': [], 'type': 'F'}}}} # 初始化列表存储每条数据 rows = [] # 遍历外层字典的所有值(处理"A"和"B2"两种层级) for outer_val in data.values(): # 如果当前值是包含iid和Invnum的字典(比如B1、B2) if isinstance(outer_val, dict) and 'iid' in outer_val and 'Invnum' in outer_val: iid = outer_val['iid'] # 遍历Invnum下的所有子项 for invnum_key, invnum_val in outer_val['Invnum'].items(): # 组装当前行的数据:先固定iid和Invnum,再合并子项的所有字段 row = {'iid': iid, 'Invnum': invnum_key} row.update(invnum_val) rows.append(row) # 转换为DataFrame df = pd.DataFrame(rows) # 按指定列顺序调整(可选,确保列顺序符合要求) target_cols = ['iid', 'Invnum', '@type', 'execId', 'CId', 'AId', 'df', 'type'] df = df[target_cols] print(df)
输出说明
运行后会生成符合预期的DataFrame,缺失的字段(比如B12的execId、df、type,B11的df、type)会自动填充为NaN,和你提供的预期截图完全匹配。
为什么这是最优方式?
- 兼容性强:不管嵌套层级里有没有缺失字段,都能自动处理,不会报错。
- 效率较高:迭代遍历的时间复杂度是O(n),n是所有
Invnum子项的数量,处理大数据量也没问题。 - 代码易读:逻辑直白,后续维护或修改字段都很方便。
内容的提问来源于stack exchange,提问作者apprunner2186
相关产品推荐
相关产品推荐

