Как фильтровать фрейм данных pandas по нескольким столбцам

Я хотел бы получить значения из столбца n, где значения в подмножестве других столбцов равны True. Пример, фрейм данных:

t, f = True, False
data = [
 [t, f, f, '1'],
 [f, f, f, '2'],
 [f, t, f, '3'],
 [f, f, t, '4']
]
df = pd.DataFrame(data, columns=list("abcn"))

дф как таблица

       a      b      c  n
0   True  False  False  1
1  False  False  False  2
2  False   True  False  3
3  False  False   True  4

столбцы для поиска - это a и b, и я хочу получить записи из n, где эти столбцы True, что я пробовал:

fcols = ("a", "b")
df[df[[*fcols]] == t].dropna(axis=0, how='all')

это дайте мне правильные записи, но с Nan в колонке n

      a     b    c    n
0  True   NaN  NaN  NaN
2   NaN  True  NaN  NaN

Я чувствую, что я более или менее близок к решению, но...

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
70
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Используйте any для агрегирования логических значений для вашего логического индексирования:

fcols = ("a", "b")

out = df[df[[*fcols]].eq(t).any(axis=1)]#.dropna(axis=0, how='all') # dropna not needed

Выход:

       a      b      c  n
0   True  False  False  1
2  False   True  False  3

Промежуточная серия индексации:

df[[*fcols]].eq(t).any(axis=1)

0     True
1    False
2     True
3    False
dtype: bool

Используйте DataFrame.any для проверки хотя бы одного True совпадения на строку для логического ряда, переданного в логическое индексирование:

fcols = ("a", "b")
df = df[df[[*fcols]].eq(t).any(axis=1)]

#if need test Trues, possible remove compare by True
df = df[df[[*fcols]].any(axis=1)]

print (df)
       a      b      c  n
0   True  False  False  1
2  False   True  False  3

Подробности:

print (df[[*fcols]].eq(t).any(axis=1))
0     True
1    False
2     True
3    False
dtype: bool

Я решил таким образом

df = df[df['a'] | df['b']]

In [5]: df
Out[5]: 
       a      b      c  n
0   True  False  False  1
2  False   True  False  3

Спасибо за ответ! но требуется использование кортежа.

Brown Bear 30.03.2023 11:33

Другие вопросы по теме