我有一个pandas DataFrame,其中索引是列的子集,即索引中的每个值也是列名,还有其他列,如下所示:
import pandas as pd
import numpy as np
df = pd.DataFrame(index=['John', 'Mary', 'Steven'],
columns=['John','Susan','Steven','Chris','Mary'],
data=np.arange(15).reshape(3,5))
我现在想将“对角线”项设置为固定值,比如说0.0。 “对角线”是指那些条目值与列名匹配的条目。我可以通过迭代索引并在该循环中将每个“对角线”条目设置为0.0来实现。
for i in df.index:
df.loc[i, i] = 0.0
但是我想知道是否有更多的pythonic方式,也许是实现这一点的矢量化。我认为必须有类似df.loc[df.index, df.index] = 0.0
的东西,但这不会产生预期的结果。
答案 0 :(得分:6)
你可以使用numpy的fill_diagonal函数
import numpy as np
#rearrange columns according to order of index
df = df.reindex(columns=list(df.index) + list(df.columns.difference(df.index)))
np.fill_diagonal(df.values,0)
print df
John Mary Steven Chris Susan
John 0 4 2 3 1
Mary 5 0 7 8 6
Steven 10 14 0 13 11