2013-07-01 183 views
1

我正在做一些使用Python中非常可愛的pandas庫的矩陣代數。由於能夠命名行和列,我非常喜歡使用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 

並保留名稱。

非常感謝,一如既往。 羅布

+0

注:我知道,最後的例子'S.dot(S)'是非常愚蠢的,並可以用'實現S * s'但它只是作爲一個例子! – LondonRob

回答

2

這個怎麼樣..

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 
+0

更新(儘管在你的原始文章中,它看起來像你想索引的數字範圍,但最多2你) – Jeff

+0

哈哈!我想我幾秒鐘就打敗你了。非常感謝傑夫。好的解決方案 – LondonRob