python - recorrer - Diccionario anidado a marco de datos de múltiples índices donde las claves del diccionario son etiquetas de columnas
lista de diccionarios python (2)
Pandas quiere los valores de MultiIndex como tuplas, no como dictados anidados. Lo más simple es convertir el diccionario al formato correcto antes de intentar pasarlo a DataFrame:
>>> reform = {(outerKey, innerKey): values for outerKey, innerDict in dictionary.iteritems() for innerKey, values in innerDict.iteritems()}
>>> reform
{(''A'', ''a''): [1, 2, 3, 4, 5],
(''A'', ''b''): [6, 7, 8, 9, 1],
(''B'', ''a''): [2, 3, 4, 5, 6],
(''B'', ''b''): [7, 8, 9, 1, 2]}
>>> pandas.DataFrame(reform)
A B
a b a b
0 1 6 2 7
1 2 7 3 8
2 3 8 4 9
3 4 9 5 1
4 5 1 6 2
[5 rows x 4 columns]
Digamos que tengo un diccionario que se ve así:
dictionary = {''A'' : {''a'': [1,2,3,4,5],
''b'': [6,7,8,9,1]},
''B'' : {''a'': [2,3,4,5,6],
''b'': [7,8,9,1,2]}}
y quiero un marco de datos que se parece a esto:
A B
a b a b
0 1 6 2 7
1 2 7 3 8
2 3 8 4 9
3 4 9 5 1
4 5 1 6 2
¿Hay una manera conveniente de hacer esto? Si intento:
In [99]:
DataFrame(dictionary)
Out[99]:
A B
a [1, 2, 3, 4, 5] [2, 3, 4, 5, 6]
b [6, 7, 8, 9, 1] [7, 8, 9, 1, 2]
Obtengo un marco de datos donde cada elemento es una lista. Lo que necesito es un multi índice donde cada nivel corresponda a las claves en el dictado anidado y las filas correspondientes a cada elemento en la lista como se muestra arriba. Creo que puedo trabajar en una solución muy cruda, pero espero que haya algo un poco más simple.
dict_of_df = {k: pd.DataFrame(v) for k,v in dictionary.items()}
df = pd.concat(dict_of_df, axis=1)
Tenga en cuenta que el orden de las columnas se pierde para python <3.6