首页 > 解决方案 > 有没有更快的方法将大量字典转换为 pandas DataFrame?

问题描述

我有一个名为list_of_dict的字典列表,格式如下:

[{'id': 123, 'date': '202001', 'variable_x': 3},
 {'id': 345, 'date': '202101', 'variable_x': 4}, ... ]

要将其转换为 pandas DataFrame,我只需执行以下操作:

df = pd.DataFrame(list_of_dict)

它可以工作,但是当尝试使用包含 2000 万个字典的列表时,运行大约需要一个小时。

Python有更快的方法来实现这一点吗?

标签: pythonpython-3.xpandaslistdictionary

解决方案


构建数据框的最快方法有多种情况是字典列表。下面的时间显示了这一点。

从根本上将 20M 行读入内存将意味着大量使用虚拟内存和交换。我期望的主要优化来自分片并且不需要内存中的所有数据。

d = [{'id': 123, 'date': '202001', 'variable_x': 3},
 {'id': 345, 'date': '202101', 'variable_x': 4}]

c = d[0].keys()
r = 2*10**5
a = np.tile([list(l.values()) for l in d], (r,1))
d = np.tile(d, r)

%timeit pd.DataFrame(d)
%timeit pd.DataFrame(a, columns=c)
%timeit pd.DataFrame(a)
print(f"2D array size: {len(a):,}\ndict array size: {len(d):,}")

输出

53.4 µs ± 238 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
90.6 ms ± 400 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
90.4 ms ± 1.45 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
2D array size: 400,000
dict array size: 400,000

推荐阅读