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

如何高效地从字典构建Pandas DataFrame?

回答

嘿,你的需求其实用pandas自带的方法就能很优雅地解决,不用自己写递归扁平化函数哦!而且你的思路方向是对的,但可以更简洁高效,下面给你几种更优的方案(另外提醒下:尽量别用dict当变量名,这是Python内置类型,容易引发冲突,我下面都改成my_dict啦):

方法1:用from_dict + stack()(最简洁高效)

这是利用pandas原生方法的最优解,代码短且性能好:

import pandas as pd

my_dict = {0: ['A', 'B', 'C'], 1: 'D'}
# 先把字典转成以key为索引的DataFrame,再堆叠列内容为行
df = pd.DataFrame.from_dict(my_dict, orient='index').stack().reset_index()
# 整理列名,删掉多余的level_1列
df.columns = ['index', 'level_1', 'values']
df = df.drop('level_1', axis=1)

解释:

  • from_dict(orient='index')会把字典的key作为行索引,value自动填充为列(单个值会变成单元素列,列表会拆成多列);
  • stack()会把所有列的内容“堆叠”成单行的Series,自动处理单个值和列表的差异;
  • 最后通过reset_index()把原索引转成列,再清理多余列、重命名就得到你要的结构了。

方法2:用explode(直观易懂,适合pandas 0.25+)

如果你的pandas版本在0.25及以上,explode方法专门用来拆分列表类型的列,可读性拉满:

import pandas as pd

my_dict = {0: ['A', 'B', 'C'], 1: 'D'}
# 先把所有值统一为列表格式,避免explode报错
df = pd.DataFrame({
    'index': list(my_dict.keys()),
    'values': [v if isinstance(v, list) else [v] for v in my_dict.values()]
})
# 拆分列表为多行
df = df.explode('values').reset_index(drop=True)

解释:

  • 先把单个值(比如'D')包装成列表['D'],确保所有values列的元素都是列表;
  • explode('values')会把每个列表里的元素拆成单独的行,同时保留对应的index值,完美匹配你的需求。

方法3:简化版列表推导(不用自定义扁平化函数)

如果你还是偏好手动构造元组列表的思路,也可以不用递归扁平化函数,直接在推导里处理:

import pandas as pd

my_dict = {0: ['A', 'B', 'C'], 1: 'D'}
# 直接判断每个value是否为列表,不是就包装成列表再迭代
tuples_list = [(k, val) for k, vals in my_dict.items() for val in (vals if isinstance(vals, list) else [vals])]
df = pd.DataFrame(tuples_list, columns=['index', 'values'])

解释:

这个写法比你原来的递归扁平化更高效,也更易读——直接在推导式里完成“统一列表格式+生成元组”的操作,没有多余的递归调用,处理大数据量时性能会更好。


内容的提问来源于stack exchange,提问作者Yicheng Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:30:41