I have a pandas dataframe I would like to se the diagonal to 0
import numpy import pandas df = pandas.DataFrame(numpy.random.rand(5,5)) df Out[6]: 0 1 2 3 4 0 0.536596 0.674319 0.032815 0.908086 0.215334 1 0.735022 0.954506 0.889162 0.711610 0.415118 2 0.119985 0.979056 0.901891 0.687829 0.947549 3 0.186921 0.899178 0.296294 0.521104 0.638924 4 0.354053 0.060022 0.275224 0.635054 0.075738 5 rows × 5 columns
now I want to set the diagonal to 0:
for i in range(len(df.index)): for j in range(len(df.columns)): if i==j: df.loc[i,j] = 0 df Out[9]: 0 1 2 3 4 0 0.000000 0.674319 0.032815 0.908086 0.215334 1 0.735022 0.000000 0.889162 0.711610 0.415118 2 0.119985 0.979056 0.000000 0.687829 0.947549 3 0.186921 0.899178 0.296294 0.000000 0.638924 4 0.354053 0.060022 0.275224 0.635054 0.000000 5 rows × 5 columns
but there must be a more pythonic way than that!?
The set_axis() function is used to assign desired index to given axis. Indexes for column or row labels can be changed by assigning a list-like or Index. The values for the new index. The axis to update.
Use the T attribute or the transpose() method to swap (= transpose) the rows and columns of pandas. DataFrame . Neither method changes the original object but returns a new object with the rows and columns swapped (= transposed object).
In [21]: df.values[[np.arange(df.shape[0])]*2] = 0 In [22]: df Out[22]: 0 1 2 3 4 0 0.000000 0.931374 0.604412 0.863842 0.280339 1 0.531528 0.000000 0.641094 0.204686 0.997020 2 0.137725 0.037867 0.000000 0.983432 0.458053 3 0.594542 0.943542 0.826738 0.000000 0.753240 4 0.357736 0.689262 0.014773 0.446046 0.000000
Note that this will only work if df
has the same number of rows as columns. Another way which will work for arbitrary shapes is to use np.fill_diagonal:
In [36]: np.fill_diagonal(df.values, 0)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With