2017-04-09 18 views
4

私は入れ子になった辞書を持っています。ナスダックのデータのようなものです。このように:ネストされた辞書をデータフレームに変換するには?

{'CLSN':  
Date  Open High Low Close Volume Adj Close             
2015-12-31 1.92 1.99 1.87 1.92 79600  1.92 
2016-01-04 1.93 1.99 1.87 1.93 39700  1.93 
2016-01-05 1.89 1.94 1.85 1.90 50200  1.90, 
'CCC':  
Date   Open  High  Low  Close Volume Adj Close                
2015-12-31 17.270000 17.389999 17.120001 17.250000 177200 16.965361 
2016-01-04 17.000000 17.219999 16.600000 17.180000 371600 16.896516 
2016-01-05 17.190001 17.530001 17.059999 17.450001 417500 17.162061, 
} 

あなたが理解を助けるために、それは、、および続いキーデータフレームですよ!

尋ねる前に、私は道pd.Panel(nas)['CLSN']を試してみましたので、私は、その値がデータフレームであると確信しています。しかし、方法はpd.Panel(nas).to_frame().reset_index()私をまったく手伝ってくれません!これは、株式名で埋められた何千もの列を持つ空のデータフレームを出力します。

index Date  Open  High  Low  Close  Volume  Adj Close           CLSN 2015-12-31 1.92  1.99  1.87  1.92  79600.0 1.92 
CLSN 2016-01-01 NaN  NaN  NaN  NaN  NaN  NaN 
ClSN 2016-01-04 1.93  1.99  1.87  1.93  39700.0 1.93 
CCC 2015-12-31 17.270000 17.389999 17.120001 17.250000 177200.0 16.965361 
CCC 2016-01-04 17.000000 17.219999 16.600000 17.180000 371600.0 16.896516 
CCC 2016-01-05 17.190001 17.530001 17.059999 17.450001 417500.0 17.162061 

確かに、私はそれぞれの株式のデータフレームを取得するためにforループを使用することができますが、それはそれらすべてを結合するために私を殺す:

は、今では悩ま、私はこのようなデータフレームがしたいです。

は、あなたがより良いアイデアを持っていますか?非常に知りたい! MaxUへ


: 方法print(nas['CLSN'].head())を使用した後、それはのような出力:

  Open High Low Close Volume Adj Close 
Date             
2015-12-31 1.92 1.99 1.87 1.92 79600  1.92 
2016-01-04 1.93 1.99 1.87 1.93 39700  1.93 
2016-01-05 1.89 1.94 1.85 1.90 50200  1.90 
2016-01-06 1.86 1.89 1.77 1.78 62100  1.78 
2016-01-07 1.75 1.80 1.75 1.77 117000  1.77 

答えて

3

UPDATE:

仮定T

出典辞書:帽子Dateは、インデックス(ではない通常の列)である

In [70]: d2 
Out[70]: 
{'CCC':     Open  High  Low  Close Volume Adj Close 
Date 
2015-12-31 17.270000 17.389999 17.120001 17.250000 177200 16.965361 
2016-01-04 17.000000 17.219999 16.600000 17.180000 371600 16.896516 
2016-01-05 17.190001 17.530001 17.059999 17.450001 417500 17.162061, 
'CLSN':    Open High Low Close Volume Adj Close 
Date 
2015-12-31 1.92 1.99 1.87 1.92 79600  1.92 
2016-01-04 1.93 1.99 1.87 1.93 39700  1.93 
2016-01-05 1.89 1.94 1.85 1.90 50200  1.90} 

ソリューション:

In [74]: pd.Panel(d2).swapaxes(0, 2).to_frame().sort_index() 
Out[74]: 
         Open  High  Low  Close Volume Adj Close 
Date  minor 
2015-12-31 CCC 17.270000 17.389999 17.120001 17.250000 177200.0 16.965361 
      CLSN 1.920000 1.990000 1.870000 1.920000 79600.0 1.920000 
2016-01-04 CCC 17.000000 17.219999 16.600000 17.180000 371600.0 16.896516 
      CLSN 1.930000 1.990000 1.870000 1.930000 39700.0 1.930000 
2016-01-05 CCC 17.190001 17.530001 17.059999 17.450001 417500.0 17.162061 
      CLSN 1.890000 1.940000 1.850000 1.900000 50200.0 1.900000 

代わり
In [73]: pd.Panel(d2).swapaxes(0, 2).to_frame().reset_index(level=0).sort_index() 
Out[73]: 
      Date  Open  High  Low  Close Volume Adj Close 
minor 
CCC 2015-12-31 17.270000 17.389999 17.120001 17.250000 177200.0 16.965361 
CCC 2016-01-04 17.000000 17.219999 16.600000 17.180000 371600.0 16.896516 
CCC 2016-01-05 17.190001 17.530001 17.059999 17.450001 417500.0 17.162061 
CLSN 2015-12-31 1.920000 1.990000 1.870000 1.920000 79600.0 1.920000 
CLSN 2016-01-04 1.930000 1.990000 1.870000 1.930000 39700.0 1.930000 
CLSN 2016-01-05 1.890000 1.940000 1.850000 1.900000 50200.0 1.900000 

あなたは、インデックスの一部としてDateを残すことができます


OLD答え - それはDateは、通常の列(いないインデックス)であることを前提としてい これを試してみてください:

dは、あなたの nested dictionaryある
In [59]: pd.Panel(d).swapaxes(0, 2).to_frame().reset_index('major', drop=True).sort_index() 
Out[59]: 
      Date Open High Low Close Volume Adj Close 
minor 
CCC 2015-12-31 17.27 17.39 17.12 17.25 177200 16.9654 
CCC 2016-01-04  17 17.22 16.6 17.18 371600 16.8965 
CCC 2016-01-05 17.19 17.53 17.06 17.45 417500 17.1621 
CLSN 2015-12-31 1.92 1.99 1.87 1.92 79600  1.92 
CLSN 2016-01-04 1.93 1.99 1.87 1.93 39700  1.93 
CLSN 2016-01-05 1.89 1.94 1.85 1.9 50200  1.9 

In [60]: d 
Out[60]: 
{'CCC':   Date  Open  High  Low  Close Volume Adj Close 
0 2015-12-31 17.270000 17.389999 17.120001 17.250000 177200 16.965361 
1 2016-01-04 17.000000 17.219999 16.600000 17.180000 371600 16.896516 
2 2016-01-05 17.190001 17.530001 17.059999 17.450001 417500 17.162061, 
'CLSN':   Date Open High Low Close Volume Adj Close 
0 2015-12-31 1.92 1.99 1.87 1.92 79600  1.92 
1 2016-01-04 1.93 1.99 1.87 1.93 39700  1.93 
2 2016-01-05 1.89 1.94 1.85 1.90 50200  1.90} 
+0

あなたが言ったように、私がやったが、それはエラーを返します: 'KeyError例外:「found''ない主要なレベルは、私はほとんど' swapaxes(0、2) '、あなたのコードが何を意味するかを理解していない、そして私にはないようです'major'の定義があります。 –

+0

@PanKevin、代わりに 'reset_index(level = 0、drop = True)'を使うこともできます。しかし、 'reset_index()'を実行した後に 'major'カラムを期待するので、それは奇妙です... – MaxU

+0

すごい!すべてのIT出力は軽微でありますが、日付の列があるmissing..Andそれはマイナーオープン高い低いを閉じるボリュームが閉じる 41.900002 42.349998 41.720001 41.810001 1449300.0 41.357005 37.369999 37.950001 37.000000 37.689999 2666200.0 37.281641 37.400002 38.029999 37.400002 37.610001 1831200.0 ADJ 'のようなものです37.202510 A 40.240002 40.990002 40.049999 40.730000 2103600.0 40.288705'、それを説明できますか? –

2

おそらくpandas.concatは、あなたが探しているものです:

In [8]: data = dict(A=pd.DataFrame([[1,2], [3,4]], columns=['X', 'Y']), 
        B=pd.DataFrame([[1,2], [3,4]], columns=['X', 'Y']),) 

In [9]: data 
Out[9]: 
{'A': X Y 
0 1 2 
1 3 4, 
'B': X Y 
0 1 2 
1 3 4} 

In [10]: pd.concat(data) 
Out[10]: 
    X Y 
A 0 1 2 
    1 3 4 
B 0 1 2 
    1 3 4 
+0

はありがとうございますが、Pythonはあまりにも動作します結果を出力するのに長い。 'DF = pd.concat(nas.keysにおけるkのpd.Panel(NAS)[K]())、それは永遠に実行されている:私はこれを使用します。 –

関連する問題