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

如何用Pandas将嵌套字典转换为带多级列的Excel文件

将嵌套字典转换为带多级列的Excel文件

要实现这个需求,我们可以通过Pandas的MultiIndex多级列结合字典扁平化处理来完成,以下是具体步骤和代码:

1. 导入依赖库

import pandas as pd

2. 定义原始数据(你的嵌套字典)

data = {
  "_id": {
    "$oid": "62f0eb4b2a5d08235eefdd9a"
  },
  "native": [
    {
      "collecttime": "08-Aug-2022 20:54:03",
      "hostname": "R3",
      "version": "16.9",
      "ios_users": [
        {"cisco": 15},
        {"developer": 15},
        {"root": 15}
      ],
      "domain_name": "cisco.com"
    }
  ],
  "interface": [
    {
      "name": "GigabitEthernet1",
      "enabled": True,
      "ietf-ip:ipv4": {
        "address": [
          {"ip": "10.10.20.48", "netmask": "255.255.255.0"}
        ]
      },
      "ietf-ip:ipv6": {}
    },
    {"name": "GigabitEthernet3",
      "type": "iana-if-type:ethernetCsmacd",
      "enabled": True,
      "ietf-ip:ipv4": {
        "address": [
          {"ip": "172.18.1.1", "netmask": "255.255.255.252"},
          {"ip": "192.168.200.6", "netmask": "255.255.255.0"}
        ]
      },
      "ietf-ip:ipv6": {}
    }
  ]
}

3. 分步处理各层级数据

处理_id字段

把嵌套的_id.$oid转换为多级列:

df_id = pd.DataFrame([data['_id']])
df_id.columns = pd.MultiIndex.from_tuples([('_id', '$oid')])

处理native字段

展开native列表,同时扁平化ios_users中的嵌套字典:

# 转换native列表为DataFrame
df_native = pd.DataFrame(data['native'])
# 合并ios_users中的多个字典为一行
df_native['ios_users'] = df_native['ios_users'].apply(lambda x: {k: v for d in x for k, v in d.items()})
# 展开ios_users列
df_native = pd.concat([df_native.drop('ios_users', axis=1), df_native['ios_users'].apply(pd.Series)], axis=1)
# 设置多级列,第一级为'native'
df_native.columns = pd.MultiIndex.from_tuples([('native', col) for col in df_native.columns])

处理interface字段

展开接口列表,同时处理ietf-ip:ipv4.address中的多组IP地址:

# 转换interface列表为DataFrame
df_interface = pd.DataFrame(data['interface'])
# 展开ietf-ip:ipv4中的address列表
df_interface = df_interface.explode('ietf-ip:ipv4')
df_interface = pd.concat([df_interface.drop('ietf-ip:ipv4', axis=1), df_interface['ietf-ip:ipv4'].apply(pd.Series)], axis=1)
df_interface = df_interface.explode('address')
df_interface = pd.concat([df_interface.drop('address', axis=1), df_interface['address'].apply(pd.Series)], axis=1)
# 处理空的ietf-ip:ipv6字段
df_interface['ietf-ip:ipv6'] = df_interface['ietf-ip:ipv6'].apply(lambda x: pd.Series(x) if x else pd.Series([None]))
# 设置多级列,第一级为'interface'
df_interface.columns = pd.MultiIndex.from_tuples([('interface', col) for col in df_interface.columns])

4. 合并所有DataFrame并对齐行

因为native只有1行,interface有3行(两个接口,其中第二个有2个IP),需要将native的行复制到对应行以对齐:

# 重置索引并复制行
df_id = df_id.loc[df_id.index.repeat(len(df_interface))].reset_index(drop=True)
df_native = df_native.loc[df_native.index.repeat(len(df_interface))].reset_index(drop=True)
# 合并所有DataFrame
final_df = pd.concat([df_id, df_native, df_interface], axis=1)

5. 导出到Excel

使用ExcelWriter导出,开启merge_cells=True让多级列的第一级自动合并单元格:

with pd.ExcelWriter('network_data.xlsx', engine='openpyxl') as writer:
    final_df.to_excel(writer, index=False, merge_cells=True)

关键说明

  • 多级列(MultiIndex):通过pd.MultiIndex.from_tuples构建层级列名,确保Excel中显示嵌套结构。
  • 字典扁平化:使用apply(pd.Series)展开嵌套字典,explode处理列表类型字段。
  • 行对齐:通过repeat方法复制单行数据,保证不同模块的行数量一致,避免合并时丢失数据。

内容的提问来源于stack exchange,提问作者chun xu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:45:46