python - 带有嵌套列表的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]]
}
如何将其转换为数据框
键列表中的列是配对的;嵌套列表分别是时间值、温度和损坏值,数据框需要将它们放在单独的列中。S for
[[a1, a1, a1], [a2, a2, a2], [a3, a3, a3]]
,你会得到一行a1, a2, a3
(第一列),然后是第二列的一行,等等。数据帧行通过组合键与下一个键进行分组,组合
d1
6d2
行(3 fromd1
和 3 fromd2
),然后d2
组合d3
6 更多行,等等。所以对于每个 3 行的 4 个键,你得到6 行的 3 种组合 == 18 行。
我尝试在连接之前转换为数据框:
new_df = pd.DataFrame(list(D.values()), columns=['Time_sec', 'Temperature', 'Damage'])
但我仍然坚持连接部分。
样本预期输出:
解决方案
您希望zip()
将给定键的每个子列表组合在一起,以组合每个子列表中的值形成新行:
>>> list(zip(*D['d1']))
[('a1', 'a2', 'a3'), ('a1', 'a2', 'a3'), ('a1', 'a2', 'a3')]
然后将其应用于字典中的每个值以生成扁平的行序列,您可以在其中选择配对。
我假设你想在这里配对dN
,dN+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