Как изменить значения диагонали, если сумма строк равна определенному числу

#python #pandas #dataframe #for-loop #if-statement

Вопрос:

Я считаю, что это простой вопрос для людей с определенным уровнем опыта работы с Python. У меня есть такой фрейм данных. Я хочу, чтобы, если сумма строк равна 0, значение диагонали изменилось на 1. Например, df. loc[2,2] и df.loc[3,3] стали 1.

введите описание изображения здесь

У меня был такой код, но я знаю, что в строке if должно быть несколько проблем.

 for i, j in zip(range(len(df.index)), range(len(df.columns))):
    if i == j amp; df.iloc[[i]].sum(axis = 1) == 0:
        df.loc[i, j] = 1
 

Ответ №1:

Предполагая, что у вас есть квадратный фрейм данных , мы можем создать логическую маску, которая представляет условие, при котором строки суммируются 0 , а затем использовать эту маску для обновления диагональных значений фрейма данных:

 m = df.sum(1).eq(0)
df.values[m, m] = 1
 

           1    2    3         4         5         6
1  0.997476  0.0  0.0  0.002414  0.000110  0.000000
2  0.000000  1.0  0.0  0.000000  0.000000  0.000000
3  0.000000  0.0  1.0  0.000000  0.000000  0.000000
4  0.000000  0.0  0.0  0.997281  0.002521  0.000173
5  0.000000  0.0  0.0  0.000693  0.999222  0.000054
6  0.000046  0.0  0.0  0.035641  0.964293  0.000000