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

如何将字典列表合并为单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 10:38:06