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

如何用自定义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_idemp_nameaddresscontactidentity
100Rahul Senindia,wb+91 987456321,example@mail.comM,30,5.6ft,70
200Sonali Mathurindia,ap+91 123456789,sample@mail.comF,25,5.2ft,56

解决方案

实现思路

  1. 编写递归函数遍历嵌套字典,提取所有叶子节点值并按层级顺序拼接为逗号分隔的字符串;
  2. 从第一条员工数据中提取顶级键作为表头;
  3. 遍历所有员工数据,用递归函数处理每个字段的嵌套结构,生成每行数据;
  4. 格式化表头和行数据,输出对齐的表格。

自定义代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:05:20