wake-up-neo.com

Verschachteltes Wörterbuch in Multiindex-Datenrahmen, wobei Wörterbuchschlüssel Spaltenbezeichnungen sind

Angenommen, ich habe ein Wörterbuch, das so aussieht:

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]}}

und ich möchte einen Datenrahmen, der ungefähr so ​​aussieht:

     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

Gibt es eine bequeme Möglichkeit, dies zu tun? Wenn ich es versuche:

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]

Ich erhalte einen Datenrahmen, in dem jedes Element eine Liste ist. Was ich brauche, ist ein Multiindex, bei dem jede Ebene den Schlüsseln im verschachtelten Diktat und den Zeilen entspricht, die jedem Element in der Liste entsprechen, wie oben gezeigt. Ich denke, ich kann eine sehr grobe Lösung finden, aber ich hoffe, dass es etwas Einfacheres gibt.

42
pbreach

Pandas möchte die MultiIndex-Werte als Tupel und nicht als verschachtelte Diktate. Am einfachsten ist es, Ihr Wörterbuch in das richtige Format zu konvertieren, bevor Sie versuchen, es an DataFrame zu übergeben:

>>> 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]
58
BrenBarn
dict_of_df = {k: pd.DataFrame(v) for k,v in dictionary.items()}
df = pd.concat(dict_of_df, axis=1)

Beachten Sie, dass die Reihenfolge der Spalten für python <3.6) verloren geht

15
user8227892