2017-09-06 15 views
1

マルチインデックスのパンダDataFramenumpy.ndarrayに変換しようとしています。データフレームは以下の通りです:パンダ複数インデックスDataFrameからNumpy Ndarray

   s1 s2 s3 s4 
Action State     
1  s1  0.0 0 0.8 0.2 
     s2  0.1 0 0.9 0.0 
2  s1  0.0 0 0.9 0.1 
     s2  0.0 0 1.0 0.0 

私は結果numpy.ndarraynp.shape() = (2,2,4)で、次のことがしたいと思います:

[[[ 0.0 0.0 0.8 0.2 ] 
    [ 0.1 0.0 0.9 0.0 ]] 

[[ 0.0 0.0 0.9 0.1 ] 
    [ 0.0 0.0 1.0 0.0]]] 

私はdf.as_matrix()を試してみましたが、これは返す:

[[ 0. 0. 0.8 0.2] 
    [ 0.1 0. 0.9 0. ] 
    [ 0. 0. 0.9 0.1] 
    [ 0. 0. 1. 0. ]] 

私はどのように各リストがActionレコードを表す第1レベルのリストのリストを返します。

+1

ただ、その後の再構築しますか? – Divakar

+1

結果の形は(2、2、4)のようになります。 –

答えて

1

次を使用することができます。

dim = len(df.index.get_level_values(0).unique()) 
result = df.values.reshape((dim1, dim1, df.shape[1])) 
print(result) 
[[[ 0. 0. 0.8 0.2] 
    [ 0.1 0. 0.9 0. ]] 

[[ 0. 0. 0.9 0.1] 
    [ 0. 0. 1. 0. ]]] 

最初の行は、ちょうどあなたがGROUPBYしたいグループの数を検索します。

なぜこの(またはgroupby)が必要なのですか:.valuesを使用するとすぐに、pandasからMultiIndexの次元が失われます。そのため、NumPyに何らかの形で次元数を再渡す必要があります。 Divakarの提案を使用して

1

一つの方法

In [151]: df.groupby(level=0).apply(lambda x: x.values.tolist()).values 
Out[151]: 
array([[[0.0, 0.0, 0.8, 0.2], 
     [0.1, 0.0, 0.9, 0.0]], 
     [[0.0, 0.0, 0.9, 0.1], 
     [0.0, 0.0, 1.0, 0.0]]], dtype=object) 
+0

残念なことに、この配列は目的の配列と同じ次元を持ちません: 結果の 'np.shape()'は '(2、)'を返し、 'np.shape()'は '(2,3 、3) ' – Scott

0

np.reshape()が働いた:

>>> print(P) 

       s1 s2 s3 s4 
Action State     
1  s1  0.0 0 0.8 0.2 
     s2  0.1 0 0.9 0.0 
2  s1  0.0 0 0.9 0.1 
     s2  0.0 0 1.0 0.0 

>>> np.reshape(P,(2,2,-1)) 

[[[ 0. 0. 0.8 0.2] 
    [ 0.1 0. 0.9 0. ]] 

[[ 0. 0. 0.9 0.1] 
    [ 0. 0. 1. 0. ]]] 

>>> np.shape(P) 

(2, 2, 4) 
+0

もっと一般的な解決策が必要だと思っていました。 –

関連する問題