2

pandasPythonのとても素敵なライブラリを使って行列代数をやっています。行と列に名前を付けることができるので、Series オブジェクトと Dataframe オブジェクトを使用するのが本当に楽しいです。

しかし、行/列の名前を維持しながらシリーズを対角化するきちんとした方法はありますか?

この最小限の作業例を考えてみましょう:

>>> import pandas as pd
>>> s = pd.Series(randn(5), index=['a', 'b', 'c', 'd', 'e'])
>>> s
a    0.137477
b   -0.606762
c    0.085030
d   -0.571760
e   -0.475104
dtype: float64

今、私はできる:

>>> import numpy as np
>>> np.diag(s)
array([[ 0.13747693,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        , -0.60676226,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.08502993,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        , -0.57176048,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        , -0.47510435]])

しかし、次のようなデータフレームを生成する方法を見つけたいと思います:

          a         b        c        d         e
0  0.137477  0.000000  0.00000  0.00000  0.000000
1  0.000000 -0.606762  0.00000  0.00000  0.000000
2  0.000000  0.000000  0.08503  0.00000  0.000000
3  0.000000  0.000000  0.00000 -0.57176  0.000000
4  0.000000  0.000000  0.00000  0.00000 -0.475104

またはおそらく(さらに良いでしょう!):

          a         b        c        d         e
a  0.137477  0.000000  0.00000  0.00000  0.000000
b  0.000000 -0.606762  0.00000  0.00000  0.000000
c  0.000000  0.000000  0.08503  0.00000  0.000000
d  0.000000  0.000000  0.00000 -0.57176  0.000000
e  0.000000  0.000000  0.00000  0.00000 -0.475104

次のような行列演算を実行できるため、これは素晴らしいことです。

>>> S.dot(s)
a    0.018900
c    0.368160
b    0.007230
e    0.326910
d    0.225724
dtype: float64

名前を保持します。

いつもありがとうございます。ロブ

4

1 に答える 1

4

これはどう..

In [107]: pd.DataFrame(np.diag(s),index=s.index,columns=s.index)
Out[107]: 
          a         b         c         d         e
a  0.630529  0.000000  0.000000  0.000000  0.000000
b  0.000000  0.360884  0.000000  0.000000  0.000000
c  0.000000  0.000000  0.345719  0.000000  0.000000
d  0.000000  0.000000  0.000000  0.796625  0.000000
e  0.000000  0.000000  0.000000  0.000000 -0.176848
于 2013-07-01T16:21:40.913 に答える