1. ホーム
  2. python

辞書のキーが列ラベルであるデータフレームをマルチインデックスするための入れ子辞書

2023-08-14 09:30:20

質問

以下のような辞書があるとします。

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

で、以下のようなデータフレームが欲しいです。

     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

何か便利な方法はないでしょうか?試してみると

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]

各要素がリストであるdataframeを取得します。私が必要とするのは、各レベルがネストされたdictのキーに対応し、行が上記のようにリストの各要素に対応するmultiindexです。私は非常に粗いソリューションを動作させることができると思いますが、私はもう少しシンプルなものがあるかもしれないと期待しています。

どのように解決するのですか?

PandasはMultiIndexの値をネストされた辞書ではなく、タプルとして欲しいと考えています。 一番簡単なのは、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]