2014-08-31 4 views
5

у меня есть Д.Ф., и я хочу, чтобы запустить что-то вроде:Выбор строки в dataframe на основе двух условий панды питона

subsetdf= df.loc[(df['Item_Desc'].str.contains('X')==True) or \ 
       (df['Item_Desc'].str.contains('Y')==True),:] 

, который выбирает все строки, которые имеют этот пункт DESc столбец подстроку «X "или" Y ".

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Я получаю сообщение об ошибке, когда я запускаю его. Любая помощь?

ответ

5

Использовать | вместо or. Итак:

df.loc[(cond1) | (cond2), :] 

Оператор or хочет сравнить два логических значения (или два выражения, оценки Истина или Ложь). Но серия (или массив numpy) не просто оценивает значение True или False, и в этом случае мы хотим сравнить оба элемента по-разному. Для этого вы можете использовать |, который называется поразрядным.

Pandas следует за обозначениями numpy. См. here в документах pandas для объяснения.

+0

Не могли бы вы направить меня на документы для этого? Это вещь панды или вещь питона? Я ничего не мог найти о «|» – robertevansanders

+0

@joris, хороший ответ. Есть ли более общий способ? например если у вас есть список имен столбцов, например. '['d1', 'd2', 'd3' ...]' есть способ указать общее условие для применения ко всем и включить строку, если какой-либо из них соответствует. В моем случае cols d1 и т. Д. Имеют 1 или 0 и хотят только строки с 1 в любом из столбцов d1 и т. Д. Существуют и другие cols, с другими данными, например. текст, который я не рассматриваю для этого выбора –

+0

Не общее решение, но в этом случае вы можете сделать что-то вроде '(df [cols] == 1) .any (axis = 1)' для использования в качестве условия. – joris

1

условие должно быть следующим

df.loc[(cond1) | (cond2)] 

Каждое условие должно быть заключено в круглые скобки, а также. Высокий приоритет задается для круглых скобок, чем побитовый оператор «OR». Если скобки не предусмотрены, это также даст такую ​​же ошибку.

Смежные вопросы