将多个词典组合成一个长格式的pandas数据帧

AGH*_*ORN 3 python dictionary dataframe pandas

我有几个字典设置如下:

Dict1 = {'Orange': ['1', '2', '3', '4']}
Dict2 = {'Red': ['3', '4', '5']}
Run Code Online (Sandbox Code Playgroud)

我希望输出是一个组合数据帧:

| Type | Value |
|--------------|
|Orange|   1   |
|Orange|   2   |
|Orange|   3   |
|Orange|   4   |
| Red  |   3   |
| Red  |   4   |
| Red  |   5   |
Run Code Online (Sandbox Code Playgroud)

我尝试将所有内容拆分,但我只在此数据帧中获得Dict2.

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

cs9*_*s95 6

一种选择是使用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
Run Code Online (Sandbox Code Playgroud)

如果性能很重要,您可以使用DataFrame.from_dict和初始化单个DataFrame 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
Run Code Online (Sandbox Code Playgroud)

或者,使用stack而不是melt(稍慢,只是为了完整性):

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
Run Code Online (Sandbox Code Playgroud)

字典解包语法适用于python3.6.在旧版本上,替换{**d1, **d2}{k: v for d in mydicts for k, v in d.items()}.