对Pandas系列进行对角化

5

我正在使用Python中非常好用的pandas库进行矩阵代数计算。我非常喜欢使用Series和Dataframe对象,因为它们能够给行和列命名。

但是有没有一种简便的方法来对角化一个Series并保留行/列名称呢?

考虑以下最小工作示例:

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

并保留名称。

非常感谢,一如既往。 罗布


注意:我意识到最后一个例子 S.dot(s) 很愚蠢,可以用 s * s 实现,但它只是作为一个例子! - LondonRob
1个回答

7
这样怎么样..
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

更新了(尽管在您的原始帖子中看起来您想要一个索引中的数字范围,但是现在更新为2) - Jeff
哈哈!我想我比你快了几秒钟。非常感谢Jeff。好的解决方案。 - LondonRob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接