Filtrado de datos de pandas con múltiples columnas booleanas

Estoy tratando de filtrar una df usando varias variables booleanas que son parte de la df, pero no he podido hacerlo.

Data de muestra:

A | B | C | D John Doe | 45 | True | False Jane Smith | 32 | False | False Alan Holmes | 55 | False | True Eric Lamar | 29 | True | True 

El tipo de dtype para las columnas C y D es booleano. Quiero crear un nuevo df (df1) con solo las filas donde C o D es Verdadero. Debe tener un aspecto como este:

 A | B | C | D John Doe | 45 | True | False Alan Holmes | 55 | False | True Eric Lamar | 29 | True | True 

He intentado algo como esto, que enfrenta problemas porque no puede manejar el tipo booleano:

 df1 = df[(df['C']=='True') or (df['D']=='True')] 

¿Algunas ideas?

 In [82]: d Out[82]: ABCD 0 John Doe 45 True False 1 Jane Smith 32 False False 2 Alan Holmes 55 False True 3 Eric Lamar 29 True True 

Solución 1:

 In [83]: d.loc[dC | dD] Out[83]: ABCD 0 John Doe 45 True False 2 Alan Holmes 55 False True 3 Eric Lamar 29 True True 

Solución 2:

 In [94]: d[d[['C','D']].any(1)] Out[94]: ABCD 0 John Doe 45 True False 2 Alan Holmes 55 False True 3 Eric Lamar 29 True True 

Solución 3:

 In [95]: d.query("C or D") Out[95]: ABCD 0 John Doe 45 True False 2 Alan Holmes 55 False True 3 Eric Lamar 29 True True 

PS Si cambias tu solución a:

 df[(df['C']==True) | (df['D']==True)] 

funcionará también

Pandas docs – indexación booleana

¡Hurra! ¡Mas opciones!

np.where

 df[np.where(df.C | df.D, True, False)] ABCD 0 John Doe 45 True False 2 Alan Holmes 55 False True 3 Eric Lamar 29 True True 

pd.Series.where en df.index

 df.loc[df.index.where(df.C | df.D).dropna()] ABCD 0.0 John Doe 45 True False 2.0 Alan Holmes 55 False True 3.0 Eric Lamar 29 True True 

df.select_dtypes

 df[df.select_dtypes([bool]).any(1)] ABCD 0 John Doe 45 True False 2 Alan Holmes 55 False True 3 Eric Lamar 29 True True 

Abusando de np.select

 df.iloc[np.select([df.C | df.D], [df.index])].drop_duplicates() ABCD 0 John Doe 45 True False 2 Alan Holmes 55 False True 3 Eric Lamar 29 True True 

O

 d[d.eval('C or D')] Out[1065]: ABCD 0 John Doe 45 True False 2 Alan Holmes 55 False True 3 Eric Lamar 29 True True 

Podrías intentarlo fácilmente:

 df1 = df[(df['C']=='True') | (df['D']=='True')] 

Nota:

  1. El operador lógico or debe ser reemplazado por el bitwise | operador.
  2. Asegúrese de que () se utilizan para encerrar cada uno de los operandos.