Disons que j'ai un dictionnaire qui ressemble à ceci:
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]}}
et je veux une trame de données qui ressemble à ceci:
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
Existe-t-il un moyen pratique de procéder? Si j'essaye:
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]
J'obtiens une trame de données où chaque élément est une liste. Ce dont j'ai besoin, c'est d'un multi-index où chaque niveau correspond aux clés du dict imbriqué et aux lignes correspondant à chaque élément de la liste comme indiqué ci-dessus. Je pense que je peux travailler une solution très grossière mais j'espère qu'il pourrait y avoir quelque chose d'un peu plus simple.
Pandas veut que les valeurs MultiIndex soient des tuples, pas des dict imbriqués. Le plus simple est de convertir votre dictionnaire au bon format avant d'essayer de le passer à 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]
dict_of_df = {k: pd.DataFrame(v) for k,v in dictionary.items()}
df = pd.concat(dict_of_df, axis=1)
Notez que l'ordre des colonnes est perdu pour python <3.6