Используйте list comprehension
для triples
, если важна производительность:
data = {'aa': {1: 4, 2: 19, 3: 70, 4: 20}, 'bb': {1: 9, 2: 3, 3: 65, 4: 20}}
L = sorted([(k,k1,v1) for k,v in data.items() for k1,v1 in v.items()],
key=lambda x: (x[0], x[1]))
print (L)
[('aa', 1, 4), ('aa', 2, 19), ('aa', 3, 70), ('aa', 4, 20),
('bb', 1, 9), ('bb', 2, 3), ('bb', 3, 65), ('bb', 4, 20)]
df = pd.DataFrame(L, columns=list('abc'))
Или concat
с Series
конструктором:
df = pd.concat({k: pd.Series(v) for k, v in data.items()}).reset_index()
df.columns = list('abc')
print (df)
a b c
0 aa 1 4
1 aa 2 19
2 aa 3 70
3 aa 4 20
4 bb 1 9
5 bb 2 3
6 bb 3 65
7 bb 4 20
При необходимости только 2 столбца:
L = sorted([(k,v1) for k,v in data.items() for k1,v1 in v.items()],
key=lambda x: (x[0], x[1]))
print (L)
[('aa', 4), ('aa', 19), ('aa', 20), ('aa', 70),
('bb', 3), ('bb', 9), ('bb', 20), ('bb', 65)]
df = pd.DataFrame(L, columns=list('ab'))
df = (pd.concat({k: pd.Series(v) for k, v in data.items()})
.reset_index(level=1, drop=True)
.reset_index())
df.columns = ['a','b']
print (df)
a b
0 aa 4
1 aa 19
2 aa 70
3 aa 20
4 bb 9
5 bb 3
6 bb 65
7 bb 20