web-dev-qa-db-fra.com

Opération logique sur deux colonnes d'une trame de données

Dans les pandas, j'aimerais créer une colonne calculée qui est une opération booléenne sur deux autres colonnes.

Dans les pandas, il est facile d'additionner deux colonnes numériques. Je voudrais faire quelque chose de similaire avec l'opérateur logique AND. Voici mon premier essai:

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().

Je suppose donc que les opérateurs logiques ne fonctionnent pas de la même manière que les opérateurs numériques dans les pandas. J'ai essayé de faire ce que le message d'erreur suggère et d'utiliser 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().

J'ai trouvé un moyen qui fonctionne en convertissant les colonnes booléennes en int, en les ajoutant ensemble et en les évaluant comme booléennes.

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

C'est compliqué. Y a-t-il une meilleure façon?

19
dinosaur

Oui, il y a une meilleure façon! Utilisez simplement le & opérateur logique et élément par élément:

d.bar & d.foo

0     True
1    False
2    False
dtype: bool
35
Kikohs