Как напечатать сумму столбцов и индекс, когда сумма не равна 0?

#python #pandas #numpy #dataframe

#python #pandas #numpy #фрейм данных

Вопрос:

У меня есть фрейм данных pandas, похожий на эту структуру:

      a      b      c    
1    0      1      0
2    0      0      0
3    1      0      0
4    0      0      0
5    0      0      0
  

Я хочу знать, равна ли сумма каждой строки != 0, поэтому я пытаюсь использовать цикл for, повторяющий каждую строку, и суммировать их с помощью встроенной .sum() функции и проверять, применимо ли условие.
Проблема в том, что 99% данных (> 200 000 записей) заполнены 0, и моя цель — узнать, какой индекс, сумма которого равна > 0.
Я пробовал это

 for x in range(len(people_killed)):
    print("Checking row" str(x))
    if people_killed.iloc[x].sum() == 0:
        people_killed = people_killed.drop(x, axis=0)
  

но потребуется много времени, чтобы просмотреть каждую строку.

Какой был бы лучший способ сделать это? Заранее большое спасибо!

Комментарии:

1. Большинство ваших вопросов открыты. Пожалуйста, подумайте о том, чтобы закрыть их, приняв ответ, который решит вашу проблему. Спасибо.

Ответ №1:

Вы можете использовать sum, а затем найти ненулевые индексы следующим образом:

 np.flatnonzero(people_killed.sum(1))
#[0, 2]
  

Ответ №2:

 people_killed[people_killed.apply(sum, axis = 1) != 0]
  

Ответ №3:

Позвольте мне дать вам краткую логику этой проблемы . Вы не должны находить сумму каждого элемента в строке, но если есть все положительные числа, тогда просто найдите единственное число, большее 0 .То есть, когда вы повторяете цикл, останавливайте цикл, пока не найдете число, большее 0.Сумма строк не станет равной нулю.

Ответ №4:

Чтобы ответить на ваш первый вопрос: как напечатать сумму столбцов (в каждой строке), выполните:

 people_killed.sum(axis=1)
  

Результат:

 1    1
2    0
3    1
4    0
5    0
dtype: int64
  

Левый столбец — это индекс, а правый столбец — суммы для каждой строки.

И что касается вашего второго вопроса, обратите внимание, что:

  • people_killed.sum(axis=1).ne(0) генерирует серию bool, отвечая на вопрос: Имеет ли эта строка ненулевую сумму?
  • people_killed[people_killed.sum(axis=1).ne(0)] извлекает все строки с суммой != 0 (пример логической индексации).

Итак, чтобы получить результат, требуется только одно дополнение: получить только индекс этих строк:

 people_killed[people_killed.sum(axis=1).ne(0)].index
  

Результат Int64Index([1, 3], dtype='int64') , так что это список
значений индекса «желаемых» строк, а не целых позиций этих строк
(как генерирует решение Ehsan).
Мое решение вычисляет именно то, что вы просили: индексы.