web-dev-qa-db-fra.com

Dictionnaire imbriqué dans une trame de données multi-index où les clés de dictionnaire sont des étiquettes de colonne

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.

33
pbreach

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]
52
BrenBarn
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

9
user8227892