использование pandas для выбора строк, обусловленных множественными эквивалентами

У меня есть pandas df, и я хотел бы выполнить что-то в этих строках (в терминах SQL):

SELECT * FROM df WHERE column1 = 'a' OR column2 = 'b' OR column3 = 'c' etc... 

Теперь это работает для одной пары столбцов / значений:

  • python, pd.read_csv рискованный импорт
  • Название или название столбца индекса Pandas
  • HDFStore: table.select и использование ОЗУ
  • Как проверить, пуст ли Pandas DataFrame?
  • Как отслеживать предыдущий столбец записи даты в кадре данных pandas?
  • pandas - добавить новый столбец в dataframe из словаря
  •  foo = df.ix[df['column']==value] 

    Однако я не уверен, как расширить это до нескольких пар столбцов / значений

  • Numpy: Умножение матрицы с тензором 3d - Предложение
  • В чем преимущество использования многострочных и однострочных строковых литералов в python?
  • Как вы можете напечатать имя переменной в python?
  • python to arduino serial read & write
  • Форма редактирования Django на основе формы добавления?
  • numpy boolean array с 1 битовыми записями
  • 2 Solutions collect form web for “использование pandas для выбора строк, обусловленных множественными эквивалентами”

    Вы должны заключить несколько условий в фигурные скобки из-за приоритета оператора и использовать побитовые и ( & ) и или ( | ) операторы:

     foo = df.ix[(df['column1']==value) | (df['columns2'] == 'b') | (df['column3'] == 'c')] 

    Если вы используете and / or , то панды, вероятно, будут стонать, что сравнение неоднозначно. В этом случае неясно, сравниваем ли мы каждое значение в ряду в условии, и что это означает, если только 1 или все, кроме 1, соответствуют условию. Вот почему вы должны использовать побитовые операторы или numpy np.all или np.any чтобы указать критерии соответствия.

    Существует также метод запроса: http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.query.html

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

    Более сжатый, но не обязательно быстрый способ заключается в использовании DataFrame.isin() и DataFrame.any()

     In [27]: n = 10 In [28]: df = DataFrame(randint(4, size=(n, 2)), columns=list('ab')) In [29]: df Out[29]: ab 0 0 0 1 1 1 2 1 1 3 2 3 4 2 3 5 0 2 6 1 2 7 3 0 8 1 1 9 2 2 [10 rows x 2 columns] In [30]: df.isin([1, 2]) Out[30]: ab 0 False False 1 True True 2 True True 3 True False 4 True False 5 False True 6 True True 7 False False 8 True True 9 True True [10 rows x 2 columns] In [31]: df.isin([1, 2]).any(1) Out[31]: 0 False 1 True 2 True 3 True 4 True 5 True 6 True 7 False 8 True 9 True dtype: bool In [32]: df.loc[df.isin([1, 2]).any(1)] Out[32]: ab 1 1 1 2 1 1 3 2 3 4 2 3 5 0 2 6 1 2 8 1 1 9 2 2 [8 rows x 2 columns] 
    Python - лучший язык программирования в мире.