我有一些数据结构,它们是numpy数组的字典,看起来像这样:
metric_one =
{0: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
1: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
2: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
3: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])}
metric_two =
{0: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
1: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
2: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
3: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])}
具有以下标签:
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
我想要一个看起来像这样的数据框:
0 1 2 3
a 0 0 0 0
b 1 1 1 1
c 2 2 2 2
d 3 3 3 3
e 4 4 4 4
f 5 5 5 5
g 6 6 6 6
h 7 7 7 7
i 8 8 8 8
j 9 9 9 9
a 0 0 0 0
b 1 1 1 1
c 2 2 2 2
d 3 3 3 3
e 4 4 4 4
f 5 5 5 5
g 6 6 6 6
h 7 7 7 7
i 8 8 8 8
j 9 9 9 9
我可以通过将每个字典转换为数据帧,然后将它们与pd.concat()串联来实现。但是,这确实很慢,尤其是当要连接的字典增长时(我需要将其中的20个连接起来)。从剖析来看,似乎在连接之前创建单个数据帧实际上花费了大部分时间。因此,我想知道是否存在更好的方法,例如以一种智能的方式将字典重新排列到包含所有字典的大数据结构中(也许在列表中?也许在大字典中?),以便我们可以通过将此大数据结构传递到构造函数中,仅构建一个数据帧。
谢谢!
最佳答案
假设
metrics = [metric_one, metric_two]
idx = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
仅使用
numpy
lol = [list(np.concatenate([m[i] for m in metrics])) for i in range(4)]
np.array(lol).T
pd.DataFrame(np.array(lol).T, idx * len(metrics))
天真的时间测试
关于python - 从字典列表创建数据框,而不使用pd.concat(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43095708/