如何用自定义Python代码将嵌套字典转为Pandas DataFrame?
问题:将嵌套字典转换为指定格式的DataFrame(无内置库依赖)
我有一个嵌套结构的字典对象,希望将其转换为类似Pandas DataFrame的结构化格式,但不能使用任何内置库,仅通过自定义Python代码实现。字典结构如下:
{ "emp": [ { "emp_id": 100, "emp_name": "Rahul Sen", "address": { "country": "india", "state": "wb" }, "contact": { "phone": "+91 987456321", "email": "example@mail.com" }, "identity": { "gender": "M", "age": 30, "physique": { "height": "5.6ft", "weight": 70 } } }, { "emp_id": 200, "emp_name": "Sonali Mathur", "address": { "country": "india", "state": "ap" }, "contact": { "phone": "+91 123456789", "email": "sample@mail.com" }, "identity": { "gender": "F", "age": 25, "physique": { "height": "5.2ft", "weight": 56 } } } ] }
期望输出的结构化格式如下(模拟DataFrame的表格形式):
| emp_id | emp_name | address | contact | identity |
|---|---|---|---|---|
| 100 | Rahul Sen | india,wb | +91 987456321,example@mail.com | M,30,5.6ft,70 |
| 200 | Sonali Mathur | india,ap | +91 123456789,sample@mail.com | F,25,5.2ft,56 |
解决方案
实现思路
- 编写递归函数遍历嵌套字典,提取所有叶子节点值并按层级顺序拼接为逗号分隔的字符串;
- 从第一条员工数据中提取顶级键作为表头;
- 遍历所有员工数据,用递归函数处理每个字段的嵌套结构,生成每行数据;
- 格式化表头和行数据,输出对齐的表格。
自定义代码实现
def flatten_nested_dict(nested_obj): """递归遍历嵌套对象,提取所有叶子节点值并返回列表""" values = [] if isinstance(nested_obj, dict): # 按键排序保证提取顺序一致(Python3.7+字典默认保留插入顺序) for key in sorted(nested_obj.keys()): values.extend(flatten_nested_dict(nested_obj[key])) else: # 叶子节点转为字符串加入列表 values.append(str(nested_obj)) return values def convert_to_table(data): """将嵌套字典数据转换为表头和行数据列表""" emp_list = data["emp"] if not emp_list: return [], [] # 获取表头(第一个员工的顶级键) headers = list(emp_list[0].keys()) rows = [] for emp in emp_list: row = [] for key in headers: # 处理嵌套字段并拼接为字符串 flattened_vals = flatten_nested_dict(emp[key]) row.append(",".join(flattened_vals)) rows.append(row) return headers, rows def print_table(headers, rows): """将表头和行数据格式化为对齐的表格输出""" # 计算每列的最大宽度,用于对齐 col_widths = [len(header) for header in headers] for row in rows: for i, val in enumerate(row): if len(val) > col_widths[i]: col_widths[i] = len(val) # 打印分隔线 separator = "+" + "+".join(["-"*(width+2) for width in col_widths]) + "+" print(separator) # 打印表头 header_line = "|" + "|".join([f" {header.ljust(col_widths[i])} " for i, header in enumerate(headers)]) + "|" print(header_line) print(separator) # 打印每行数据 for row in rows: row_line = "|" + "|".join([f" {val.ljust(col_widths[i])} " for i, val in enumerate(row)]) + "|" print(row_line) print(separator) # 测试数据 emp_data = { "emp": [ { "emp_id": 100, "emp_name": "Rahul Sen", "address": {"country": "india", "state": "wb"}, "contact": {"phone": "+91 987456321", "email": "example@mail.com"}, "identity": {"gender": "M", "age": 30, "physique": {"height": "5.6ft", "weight": 70}} }, { "emp_id": 200, "emp_name": "Sonali Mathur", "address": {"country": "india", "state": "ap"}, "contact": {"phone": "+91 123456789", "email": "sample@mail.com"}, "identity": {"gender": "F", "age": 25, "physique": {"height": "5.2ft", "weight": 56}} } ] } # 执行转换并打印表格 headers, rows = convert_to_table(emp_data) print_table(headers, rows)
代码说明
flatten_nested_dict:递归处理任意层级的嵌套字典,将所有叶子节点值按键排序顺序提取为列表,最终拼接成逗号分隔的字符串;convert_to_table:提取表头结构,遍历每个员工数据,处理每个字段的嵌套内容,生成标准化的行数据;print_table:自动计算列宽,将表头和行数据格式化为对齐的表格,模拟DataFrame的展示效果。
内容的提问来源于stack exchange,提问作者Saptarsi Basu
相关产品推荐
相关产品推荐

