#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).
Мое решение вычисляет именно то, что вы просили: индексы.