如何高效地从字典构建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
相关产品推荐
相关产品推荐

