3

マルチインデックス データ フレームに変換したいネストされたディクショナリ オブジェクトがあります。

例えば

t['a'] = dict()
t['b'] = dict()
t['a']['1'] = pd.DataFrame([ [1.0,2.0],[3.0,4.0] ])
t['a']['2'] = pd.DataFrame([ [5.0,6.0],[7.0,8.0] ])
t['b']['1'] = pd.DataFrame([ [1.0,2.0],[3.0,4.0] ])
t['b']['2'] = pd.DataFrame([ [5.0,6.0],[7.0,8.0] ])

だから私は次のようなインデックスを持つ1つのデータフレームに変換したい

a
   1        0      1  
      0    1.0    2.0 
      1    3.0    4.0
   2  
      0    5.0    6.0
      1    7.0    8.0
b
   1
      0    1.0    2.0
      1    3.0    4.0
   2
      0    5.0    6.0
      1    7.0    8.0

使用できると思いますMultiIndex(levels=[ ['a','b'], [1,2] ])が、ラベルの作成方法がわかりません。また、dict値をデータ配列として渡す方法もわかりません。

4

2 に答える 2

4

here で説明されているように、タプルのリストから MultiIndex にアクセスするのが最も簡単だと思います。

あなたの例を使用すると、次のようなネストされた辞書があります

In [25]: t
Out[25]: 
{'a': {'1':    0  1
0  1  2
1  3  4, '2':    0  1
0  5  6
1  7  8},
 'b': {'1':    0  1
0  1  2
1  3  4, '2':    0  1
0  5  6
1  7  8}}

少し頭を悩ませたい場合は、次のリスト内包表記を使用できます。

In [50]: tuples = [(x, y, z) for x in t for y in t[x] for z in t[x][y]]

In [51]: tuples
Out[51]: 
[('a', '1', 0),
 ('a', '1', 1),
 ('a', '2', 0),
 ('a', '2', 1),
 ('b', '1', 0),
 ('b', '1', 1),
 ('b', '2', 0),
 ('b', '2', 1)]

そしてidx = pd.MultiIndex.from_tuples(tuples)、インデックスとして機能します。

値をアンパックするのは、もう少し手間がかかります。

編集:あなたは本当にジェフの答えに行くべきですが、完全を期すために:

In [114]: df = pd.concat([x for z in t for x in t[z].values()])

In [115]: df.index = idx

In [118]: df
Out[118]: 
       0  1
a 1 0  1  2
    1  3  4
  2 0  5  6
    1  7  8
b 1 0  1  2
    1  3  4
  2 0  5  6
    1  7  8
于 2013-07-11T20:45:58.053 に答える
1

フレームの dict がパネルを形成to_frameし、2 レベルのインデックスに変換されます。dict が渡されたときに concat が形成される追加のレベルが必要です

理論的には、より多くのレベルが必要な場合は、再帰的な削減のようなことを行うことができますが、それは脳を爆破します. 正確な出力を得るには、sortlevel.

In [36]: concat( dict([ (k,Panel(v).to_frame()) for k,v in t.items() ]) , names= ['level'])
Out[36]: 
                   1  2
level major minor      
a     0     0      1  5
            1      2  6
      1     0      3  7
            1      4  8
b     0     0      1  5
            1      2  6
      1     0      3  7
            1      4  8
于 2013-07-11T20:27:36.277 に答える