Выберите строки со значениями больше V в более чем C столбцах

У меня есть следующий фреймворк pandas

Index   A   B   C   D
----------------------
1       2   0   0   10
2       0   3   6   0
3       4   3   2   0
4       3   2   6   3
5       1   1   1   0

Я хочу запросить этот фрейм данных, чтобы выбрать все строки со значениями больше 1 (V) в столбцах больше 2 (C).

В этом случае выбранные строки будут иметь индекс 3, а 4 будут выбраны, поскольку они имеют значения больше 1, появляющиеся более чем в 2 столбцах, а именно. Индекс 3 имеет 4, 3, 2 (все больше 1), появляющиеся в A, B, C, т.е. 3 столбца, и аналогично, индекс 4 имеет значения 3, 2, 6, 3 (все больше 1), появляющиеся в A, B, C и D, то есть 4 столбца.

Ожидаемый результат

Index   A   B   C   D
----------------------
3       4   3   2   0
4       3   2   6   3

person Afsan Abdulali Gujarati    schedule 27.12.2018    source источник


Ответы (1)


Вы можете создать следующую маску для выделения строк:

import pandas as pd

data = [[2, 0, 0, 10],
        [0, 3, 6, 0],
        [4, 3, 2, 0],
        [3, 2, 6, 3],
        [1, 1, 1, 0]]

df = pd.DataFrame(data=data, columns=list('ABCD'))
mask = (df.values > 1).sum(axis=1) > 2
print(df[mask])

Вывод

   A  B  C  D
2  4  3  2  0
3  3  2  6  3

Основная идея создания маски - создать массив логических значений, где True означает, что значение больше 1, затем суммировать эти значения по строкам, и если сумма больше 2, это означает, что было более двух значений больше 1.

В качестве альтернативы вы можете использовать numpy.count_nonzero для создания маски:

import pandas as pd
import numpy as np

data = [[2, 0, 0, 10],
        [0, 3, 6, 0],
        [4, 3, 2, 0],
        [3, 2, 6, 3],
        [1, 1, 1, 0]]

df = pd.DataFrame(data=data, columns=list('ABCD'))
mask = np.count_nonzero(df.values > 1, axis=1) > 2
print(df[mask])

Вывод

   A  B  C  D
2  4  3  2  0
3  3  2  6  3
person Dani Mesejo    schedule 27.12.2018