首页 > 解决方案 > 带有嵌套列表的Python字典键到pandas DataFrame

问题描述

我有一本字典如下:

D = {
    'd1': [[a1, a1, a1], [a2, a2, a2], [a3, a3, a3]], 
    'd2': [[b1, b1, b1], [b2, b2, b2], [b3, b3, b3]], 
    'd3': [[c1, c1, c1], [c2, c2, c2], [c3, c3, c3]], 
    'd4': [[d1, d1, d1], [d2, d2, d2], [d3, d3, d3]]
}

如何将其转换为数据框

我尝试在连接之前转换为数据框:

new_df = pd.DataFrame(list(D.values()), columns=['Time_sec', 'Temperature', 'Damage'])

但我仍然坚持连接部分。

样本预期输出:

预期输出数据帧

标签: pythonpython-3.xpandasdictionaryconcatenation

解决方案


您希望zip()将给定键的每个子列表组合在一起,以组合每个子列表中的值形成新行:

>>> list(zip(*D['d1']))
[('a1', 'a2', 'a3'), ('a1', 'a2', 'a3'), ('a1', 'a2', 'a3')]

然后将其应用于字典中的每个值以生成扁平的行序列,您可以在其中选择配对。

我假设你想在这里配对dNdN+1不管键的数量是多少。请注意,字典实际上是无序的(尽管保留了 Python 3.6 及更高版本的插入顺序),因此您可能需要先应用一些排序:

sorted_keys = sorted(D)

之后我们可以将它们与zip(sorted_keys, sorted_keys[1:])

>>> sorted_keys = sorted(D)
>>> list(zip(sorted_keys, sorted_keys[1:]))
[('d1', 'd2'), ('d2', 'd3'), ('d3', 'd4')]

使用此序列配对行并展平生成的键序列,然后是压缩行:

sorted_keys = sorted(D)
paired = (k for keys in zip(sorted_keys, sorted_keys[1:]) for k in keys)
df = pd.DataFrame(
    (row for k in paired for row in zip(*D[k])), 
    columns=['Time_sec', 'Temperature', 'Damage']
)

这会产生:

   Time_sec Temperature Damage
0        a1          a2     a3
1        a1          a2     a3
2        a1          a2     a3
3        b1          b2     b3
4        b1          b2     b3
5        b1          b2     b3
6        b1          b2     b3
7        b1          b2     b3
8        b1          b2     b3
9        c1          c2     c3
10       c1          c2     c3
11       c1          c2     c3
12       c1          c2     c3
13       c1          c2     c3
14       c1          c2     c3
15       d1          d2     d3
16       d1          d2     d3
17       d1          d2     d3

推荐阅读