如何将字典列表合并为单个DataFrame,以字典键为列并展开列表值
如何将字典列表合并为单个DataFrame,以字典键为列并展开列表值
看起来你想要把包含列表值的字典列表转换成展开后的DataFrame,让每个DNS和对应的IP各占一行对吧?我来帮你搞定这个问题~
首先先把你的输入数据修正为合法的Python格式(原数据有语法小问题):
dns_result = [ {"DNS": ["dns.com", "dns2.com"], "IP": ["10.10.10.10", "10.10.10.11"]}, {"DNS": ["something.com", "something2.com"], "IP": ["50.50.50.10", "50.50.50.51"]} ]
最简洁的方法:使用Pandas的explode()函数
Pandas内置的explode()函数专门用来处理这种「列值是列表,需要展开成多行」的场景,而且能自动保持对应列的关联关系,一步就能得到你想要的结果:
import pandas as pd # 先把字典列表转成初始DataFrame,此时DNS和IP列都是列表 df = pd.DataFrame(dns_result) # 同时展开DNS和IP列的列表值 df_final = df.explode(["DNS", "IP"]) # 查看结果 print(df_final.to_string(index=False))
运行后输出的结果完全符合你的需求:
DNS IP dns.com 10.10.10.10 dns2.com 10.10.10.11 something.com 50.50.50.10 something2.com 50.50.50.51
更直观的底层实现方法:手动扁平化数据
如果你想理解底层逻辑,也可以用列表推导式先把嵌套的字典列表拆成扁平的字典,再转成DataFrame:
import pandas as pd # 手动遍历每个字典,把DNS和IP一一对应打包成新的字典 flat_data = [] for item in dns_result: # 用zip把每个字典里的DNS列表和IP列表配对 for dns, ip in zip(item["DNS"], item["IP"]): flat_data.append({"DNS": dns, "IP": ip}) # 转成DataFrame df_final = pd.DataFrame(flat_data)
这个方法得到的结果和上面完全一致,适合你理解数据转换的过程。
关于你之前尝试的方法
你之前用的pd.DataFrame.from_dict()、pd.concat()这些方法,大多是把整个列表当成单个单元格的值,没有触发「展开列表成多行」的逻辑,所以才会出现要么是2行包含列表值、要么是1行打包所有内容的情况,而explode()就是专门解决这个场景的工具。
备注:内容来源于stack exchange,提问作者Data1234
相关产品推荐
相关产品推荐

