Фрейм данных Pandas: Значение истинности ряда неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all()

#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.