如何将含数组的嵌套字典转换为指定结构的Pandas DataFrame
嵌套字典转Pandas多列DataFrame解决方案
问题描述
我有如下结构的嵌套字典:
{'hostname1': {1 : {'ip1': ['a','b','c']}}, 'hostname2': {2 : {'ip2': ['d','e','f']}}}
其宏观结构可表示为:
dict={{{}[]}} 或 dict[hostname][id][ip][letter_list]
我希望将该字典转换为包含hostname、id、ip、letter四列的Pandas DataFrame,示例结构如下:
| hostname | id | ip | letter |
|---|---|---|---|
| hostname1 | 1 | ip1 | a |
| hostname1 | 1 | ip1 | b |
| hostname1 | 1 | ip1 | c |
| hostname2 | 2 | ip2 | d |
| ... | .. | ... | ... |
直接使用df = pd.DataFrame(dict)无法实现需求,请求解决方法。
解决方法
方法一:手动遍历生成数据列表
逐层遍历嵌套字典,把每个元素拆成DataFrame需要的行数据,逻辑清晰易懂:
import pandas as pd # 示例数据 data_dict = {'hostname1': {1 : {'ip1': ['a','b','c']}}, 'hostname2': {2 : {'ip2': ['d','e','f']}}} rows = [] # 遍历主机名层 for hostname, id_dict in data_dict.items(): # 遍历id层 for id_val, ip_dict in id_dict.items(): # 遍历ip层 for ip, letters in ip_dict.items(): # 遍历每个字母,生成行 for letter in letters: rows.append({ 'hostname': hostname, 'id': id_val, 'ip': ip, 'letter': letter }) # 转成DataFrame df = pd.DataFrame(rows) print(df)
方法二:用pd.json_normalize结合explode简化操作
利用Pandas内置函数处理嵌套结构,适合更复杂的场景:
import pandas as pd data_dict = {'hostname1': {1 : {'ip1': ['a','b','c']}}, 'hostname2': {2 : {'ip2': ['d','e','f']}}} # 外层转Series,重置索引得到hostname列 s = pd.Series(data_dict).rename('data') df = s.reset_index().rename(columns={'index': 'hostname'}) # 展开id层,提取id和对应的ip数据 df = df.explode('data').reset_index(drop=True) df['id'] = df['data'].apply(lambda x: list(x.keys())[0]) df['ip_data'] = df['data'].apply(lambda x: list(x.values())[0]) # 展开ip层,提取ip和字母列表 df = df.explode('ip_data').reset_index(drop=True) df['ip'] = df['ip_data'].apply(lambda x: list(x.keys())[0]) df['letter'] = df['ip_data'].apply(lambda x: list(x.values())[0]) # 展开字母列表并清理冗余列 df = df.explode('letter').drop(columns=['data', 'ip_data']) print(df)
内容的提问来源于stack exchange,提问作者César Rafael Sorgato Santos
相关产品推荐
相关产品推荐

