Python 以长格式将多个词典合并到一个数据帧中

Python 以长格式将多个词典合并到一个数据帧中,python,pandas,dictionary,dataframe,Python,Pandas,Dictionary,Dataframe,我有几本字典设置如下: Dict1 = {'Orange': ['1', '2', '3', '4']} Dict2 = {'Red': ['3', '4', '5']} 我希望输出是一个组合数据帧: | Type | Value | |--------------| |Orange| 1 | |Orange| 2 | |Orange| 3 | |Orange| 4 | | Red | 3 | | Red | 4 | | Red | 5

我有几本字典设置如下:

Dict1 = {'Orange': ['1', '2', '3', '4']}
Dict2 = {'Red': ['3', '4', '5']}
我希望输出是一个组合数据帧:

| Type | Value |
|--------------|
|Orange|   1   |
|Orange|   2   |
|Orange|   3   |
|Orange|   4   |
| Red  |   3   |
| Red  |   4   |
| Red  |   5   |
我试着把所有的东西都分离出来,但在这个数据框中我只得到了Dict2

mydicts = [Dict1, Dict2]
for x in mydicts:
    for k, v in x.items():
        df = pd.DataFrame(v)
        df['Type'] = k

一个选项是使用
pd.concat

pd.concat(map(pd.DataFrame, mydicts), axis=1).melt().dropna()

  variable value
0   Orange     1
1   Orange     2
2   Orange     3
3   Orange     4
4      Red     3
5      Red     4
6      Red     5

如果性能很重要,您可以使用
DataFrame初始化单个数据帧。从_dict
melt

pd.DataFrame.from_dict({**Dict1, **Dict2}, orient='index').T.melt().dropna()
  variable value
0   Orange     1
1   Orange     2
2   Orange     3
3   Orange     4
4      Red     3
5      Red     4
6      Red     5
或者,使用
stack
而不是
melt
(稍微慢一点,只是为了完整性):

字典解包语法适用于python3.6。在旧版本中,将
{**d1,**d2}
替换为
{k:v代表d在mydicts中代表k,v代表d.items()}


堆栈之后
,它成为一个问题


在你的第二个例子中,有没有一种方法可以重复使用字典而不是单独命名它们?@ATCH_是的,请看我刚才添加的脚注。
res = (pd.DataFrame.from_dict({**Dict1, **Dict2}, orient='index').T
         .stack()
         .reset_index(level=1)
         .sort_values('level_1'))
res.columns = ['Type', 'Value']

print(res)
     Type Value
0  Orange     1
1  Orange     2
2  Orange     3
3  Orange     4
0     Red     3
1     Red     4
2     Red     5
pd.DataFrame(
    [(t, v)
     for t, V in {**Dict1, **Dict2}.items()
     for v in V],
    columns=['Type', 'Value']
)

     Type Value
0  Orange     1
1  Orange     2
2  Orange     3
3  Orange     4
4     Red     3
5     Red     4
6     Red     5
s=pd.DataFrame(mydicts).stack().reset_index(level=1)
unnesting(s,[0])
Out[829]: 
   0 level_1
0  1  Orange
0  2  Orange
0  3  Orange
0  4  Orange
1  3     Red
1  4     Red
1  5     Red