Один вариант использует 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, используя DataFrame.from_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
(немного медленнее, просто для полноты):
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
Синтаксис распаковки словаря работает с python3.6.В старых версиях замените {**d1, **d2}
на {k: v for d in mydicts for k, v in d.items()}
.