Pandas Dataframe,更改“对角线”的值(其中index-value等于column-name)

时间:2015-06-23 14:09:07

标签: python pandas

我有一个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的东西,但这不会产生预期的结果。

1 个答案:

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