用Pandas系列中的元素填充Pandas DataFrame的对角线

时间:2018-07-25 13:40:19

标签: python python-3.x pandas dataframe linear-algebra

给出一个带有索引的大熊猫Series

import pandas as pd

s = pd.Series(data=[1,2,3],index=['a','b','c'])

如何在熊猫版本> = 0.23.0中使用系列填充空白数据框的对角线条目?

生成的DataFrame如下所示:

  a b c
a 1 0 0
b 0 2 0
c 0 0 3

a prior similar question会用相同的值填充对角线,我的问题是要用来自Series的不同值填充对角线。

预先感谢您的考虑和回应。

2 个答案:

答案 0 :(得分:3)

首先创建NoSuchElementException,然后创建numpy.fill_diagonal

subjectIterator.next()

另一种解决方案是创建空的java.util.NoSuchElementException: null at java.util.ArrayList$Itr.next(Unknown Source) at org.cmos.student.subject.category.CategoryManager.addSubjectsToCategory(CategoryManager.java:221) 数组,向对角线添加值,最后使用addToCategory(subjectIterator.next().getId());构造函数:

DataFrame

答案 1 :(得分:3)

我不确定直接用Pandas做它,但是如果您不介意使用numpy.diag()为您的系列建立对角线数据矩阵,然后将其插入DataFrame,则可以轻松完成此操作:

diag_data = np.diag(s)  # don't need s.as_matrix(), turns out
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个元素的随机数组构成的系列的时序比较:

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)

看起来这里显示的第一个和第三个选项基本相同,而中间的选项最慢。