Python 从dict和list生成数据帧的最简单方法

Python 从dict和list生成数据帧的最简单方法,python,pandas,list,dataframe,dictionary,Python,Pandas,List,Dataframe,Dictionary,我有一份口述和一份清单: d1 = {"k1": [1,2,3], "k2": [4,5,6], "k3": [3,2,1]} l1 = ["label1", "label2", "label1"] 我想把它组合成一个数据帧。l1中的每个元素对应于d1 所需输出(数据帧): 最简单和最具Python风格的方法是什么?我们可以使用数据帧。熔化和系列。映射,智能使用压缩列表和di

我有一份口述和一份清单:

d1 = {"k1": [1,2,3], "k2": [4,5,6], "k3": [3,2,1]}
l1 = ["label1", "label2", "label1"]
我想把它组合成一个数据帧。
l1
中的每个元素对应于
d1

所需输出(数据帧):


最简单和最具Python风格的方法是什么?

我们可以使用
数据帧。熔化
系列。映射
,智能使用
压缩
列表和dict键:

from collections import OrderedDict

df = pd.DataFrame(d1).melt(var_name='key')
df['label'] = df['key'].map(OrderedDict(zip(d1.keys(), l1)))

  key  value   label
0  k1      1  label1
1  k1      2  label1
2  k1      3  label1
3  k2      4  label2
4  k2      5  label2
5  k2      6  label2
6  k3      3  label1
7  k3      2  label1
8  k3      1  label1

请注意,
d1.keys()
的顺序不能保证排序。所以
zip(d1.keys(),l1)
可能会给出不同的结果。这与
Series.map
@QuangHoang有关系吗?不是
map
,而是
dict(zip(…)
)。因此,您可能有
k1:label2
。是的,使用
orderedict
添加了修复,这应该可以解决问题,同意吗@QuangHoangOf course
OrderedDict
可以解决这个问题。但这对OP来说更像是一个数据结构问题。将
OrderedDict
包装在
zip(d1.keys(),l1)
周围并不能解决
d1.keys()
的随机性。
from collections import OrderedDict

df = pd.DataFrame(d1).melt(var_name='key')
df['label'] = df['key'].map(OrderedDict(zip(d1.keys(), l1)))

  key  value   label
0  k1      1  label1
1  k1      2  label1
2  k1      3  label1
3  k2      4  label2
4  k2      5  label2
5  k2      6  label2
6  k3      3  label1
7  k3      2  label1
8  k3      1  label1