如何用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
相关产品推荐
相关产品推荐

