Подтвердить что ты не робот

Логическая операция на двух столбцах кадра данных

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

В pandas легко добавить два числовых столбца. Я хотел бы сделать что-то подобное с логическим оператором AND. Здесь моя первая попытка:

In [1]: d = pandas.DataFrame([{'foo':True, 'bar':True}, {'foo':True, 'bar':False}, {'foo':False, 'bar':False}])

In [2]: d
Out[2]: 
     bar    foo
0   True   True
1  False   True
2  False  False

In [3]: d.bar and d.foo   ## can't
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Итак, я думаю, что логические операторы работают не так, как числовые операторы в pandas. Я попытался сделать то, что предлагает сообщение об ошибке, и используя bool():

In [258]: d.bar.bool() and d.foo.bool()  ## spoiler: this doesn't work either
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Я нашел способ, который работает, отбрасывая булевские столбцы до int, добавляя их вместе и оценивая как логическое.

In [4]: (d.bar.apply(int) + d.foo.apply(int)) > 0  ## Logical OR
Out[4]: 
0     True
1     True
2    False
dtype: bool

In [5]: (d.bar.apply(int) + d.foo.apply(int)) > 1  ## Logical AND
Out[5]: 
0     True
1    False
2    False
dtype: bool

Это свернуто. Есть ли лучший способ?

4b9b3361

Ответ 1

Да, есть лучший способ! Просто используйте логический и оператор & по элементам:

d.bar & d.foo

0     True
1    False
2    False
dtype: bool