#python #pandas #dataframe #loops #valueerror
Вопрос:
У меня есть такая матрица, и я хочу, чтобы диагональ была равна 1, если сумма строк равна 0. В этом случае (2,2) и (3,3) станут 1. Я написал цикл «для». Хотя я использую .all(), это дает мне точку ошибки значения в строке if.
Markov_sub 1 2 3 4 5 6 1 0.997476 0.0 0.0 0.002414 0.000110 0.000000 2 0.000000 0.0 0.0 0.000000 0.000000 0.000000 3 0.000000 0.0 0.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 for i in (range(0, len(Markov_sub.index)-1)): if 0 == Markov_sub.iloc[[i]].all(): Markov_sub.iloc[i, i] = 1 Markov_sub
Комментарии:
1.
Markov_sub.iloc[[i]]
возвращает фрейм данных с одной строкой, и ось по умолчанию.all()
должна работать над каждым столбцом, чтобы в результате вы все равно получили логический ряд. Вам либо нужноMarkov_sub.iloc[[i]].all(axis=1)
, либо действительно просто срезать строку как серию для начала:Markov_sub.iloc[i].all()
2. Разве ты не упоминал
if the row sums to 0
? Разве это не должно бытьdf.sum(axis=1).eq(0)
вместо этого?3. Привет @ALollz, спасибо за вклад! И просто хочу распечатать строку для дальнейшего использования:) если (0 == test.iloc[i]).все(): ——что есть круглые скобки вокруг 0 == iloc.