выбор строк из фрейма данных на основе условий составной логики

#python-3.x #pandas #dataframe

Вопрос:

У меня есть фрейм данных , в нем x три столбца, A, B and C

 import pandas as pd X = pd.DataFrame() X['A'] = [-100, 0, 2, 3] X['B'] = [0, -100, 1, 2] X['C'] = [0, 0, 0, 1] X   A B C 0 -100 0 0 1 0 -100 0 2 2 1 0 3 3 2 1  

Я хотел бы найти строки, которые удовлетворяют следующему условию,

 (If either column A or column B value equals to -100) OR (the column C value equals to 1)  

С точки зрения приведенного выше примера, строки [0,1,3] — это то, что я хочу получить

Я попробовал вот это,

 x1 = ( X[['A','B']]== -100 ) or (X['C'] == 1)  

но получите следующее сообщение об ошибке, каким должен быть правильный подход?

 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) ~AppDataLocalTemp/ipykernel_23048/1363478251.py in lt;modulegt; ----gt; 1 x1 = ( X[['A','B']]== -100 ) or (X['C'] == 1)  ~Anaconda3envspyrolibsite-packagespandascoregeneric.py in __nonzero__(self)  1327   1328 def __nonzero__(self): -gt; 1329 raise ValueError(  1330 f"The truth value of a {type(self).__name__} is ambiguous. "  1331 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."  ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().  

Ответ №1:

Есть 2 ошибки.

  1. вы не можете использовать or с сериями, вы должны использовать побитовое или: |
  2. вам нужно объединить сравнения в левой части, используя any

nb. Я использовал A.eq(B) для ясности, но это эквивалентно A == B

 x1 = X[['A','B']].eq(-100).any(axis=1) | X['C'].eq(1)  

выход:

 0 True 1 True 2 False 3 True dtype: bool  
нарезка рядов

чтобы выбрать соответствующие строки:

 X[x1]  

выход:

 A B C 0 -100 0 0 1 0 -100 0 3 3 2 1