我不确定能否直接使用Pandas实现,但是如果您不介意使用numpy.diag()
构建序列的对角线数据矩阵,然后将其插入到DataFrame中,那么这很容易实现:
diag_data = np.diag(s)
df = pd.DataFrame(diag_data, index=s.index, columns=s.index)
a b c
a 1 0 0
b 0 2 0
c 0 0 3
一句话概括:
df = pd.DataFrame(np.diag(s),
index=s.index,
columns=s.index)
与由10000个随机元素组成的Series进行时间比较:
s = pd.Series(np.random.rand(10000), index=np.arange(10000))
df = pd.DataFrame(np.diag(s), ...)
173 ms ± 2.91 ms per loop (mean ± std. dev. of 7 runs, 20 loops each)
df = pd.DataFrame(0, ...)
np.fill_diagonal(df.values, s)
212 ms ± 909 µs per loop (mean ± std. dev. of 7 runs, 20 loops each)
mat = np.zeros(...)
np.fill_diagonal(mat, s)
df = pd.DataFrame(mat, ...)
175 ms ± 3.72 ms per loop (mean ± std. dev. of 7 runs, 20 loops each)
看起来这里展示的第一和第三个选项本质上是相同的,而中间的选项最慢。