2016-01-27 10 views
12

In panda, vorrei creare una colonna calcolata che sia un'operazione booleana su altre due colonne.Operazione logica su due colonne di un dataframe

In panda, è facile aggiungere insieme due colonne numeriche. Mi piacerebbe fare qualcosa di simile con l'operatore logico AND. Ecco il mio primo tentativo:

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

Quindi credo che gli operatori logici non funzionano del tutto allo stesso modo di operatori numerici in panda. Ho provato a fare ciò che suggerisce il messaggio di errore e utilizzando 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(). 

ho trovato un modo che funziona gettando le colonne booleane per int, sommandoli e valutare come un valore booleano.

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 

Questo è contorto. C'è un modo migliore?

risposta

18

Sì, c'è un modo migliore! Basta usare il & elemento logico e operatore:

d.bar & d.foo 

0  True 
1 False 
2 False 
dtype: bool 
+2

Grazie! Questo è menzionato nei documenti panda ovunque? – dinosaur

+2

@dinosaur Sì, ci sono esempi di utilizzo di '&' e '|' in [la sezione di indicizzazione booleana] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing) –

Problemi correlati