¿Cómo seleccionar filas en un DataFrame entre dos valores, en Python Pandas?

Estoy tratando de modificar un DataFrame df para que solo contenga filas para las cuales los valores en la columna closing_price están entre 99 y 101 y trato de hacerlo con el código a continuación.

Sin embargo, me sale el error

ValueError: El valor de verdad de una serie es ambiguo. Utilice a.empty, a.bool (), a.item (), a.any () o a.all ()

y me pregunto si hay una manera de hacer esto sin usar bucles.

 df = df[(99 <= df['closing_price'] <= 101)] 

Debe usar () para agrupar su vector booleano para eliminar la ambigüedad.

 df = df[(df['closing_price'] >= 99) & (df['closing_price'] <= 101)] 

Considera también series entre :

 df = df[df['closing_price'].between(99, 101, inclusive=True)] 

Hay una alternativa más agradable: usar el método de consulta () :

 In [58]: df = pd.DataFrame({'closing_price': np.random.randint(95, 105, 10)}) In [59]: df Out[59]: closing_price 0 104 1 99 2 98 3 95 4 103 5 101 6 101 7 99 8 95 9 96 In [60]: df.query('99 <= closing_price <= 101') Out[60]: closing_price 1 99 5 101 6 101 7 99 

ACTUALIZACIÓN: respondiendo al comentario:

Me gusta la syntax aquí, pero me caí al intentar combinar con la expresión; df.query('(mean + 2 *sd) <= closing_price <=(mean + 2 *sd)')

 In [161]: qry = "(closing_price.mean() - 2*closing_price.std())" +\ ...: " <= closing_price <= " + \ ...: "(closing_price.mean() + 2*closing_price.std())" ...: In [162]: df.query(qry) Out[162]: closing_price 0 97 1 101 2 97 3 95 4 100 5 99 6 100 7 101 8 99 9 95 
 newdf = df.query('closing_price.mean() <= closing_price <= closing_price.std()') 

o

 mean = closing_price.mean() std = closing_price.std() newdf = df.query('@mean <= closing_price <= @std') 

También puedes usar el método .between()

 emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv") emp[emp["Salary"].between(60000, 61000)] 

Salida

introduzca la descripción de la imagen aquí

En lugar de esto

 df = df[(99 <= df['closing_price'] <= 101)] 

Deberias usar esto

 df = df[(df['closing_price']>=99 ) & (df['closing_price']<=101)] 

Tenemos que usar los operadores lógicos a nivel de bits de NumPy |, &, ~, ^ para las consultas de composición. Además, los paréntesis son importantes para la precedencia del operador.

Para obtener más información, puede visitar el enlace: Comparaciones, máscaras y lógica booleana.

Si está tratando con múltiples valores y múltiples entradas, también podría configurar una función de aplicación como esta. En este caso, filtrar un dataframe para ubicaciones GPS que caen dentro de ciertos rangos.

 def filter_values(lat,lon): if abs(lat - 33.77) < .01 and abs(lon - -118.16) < .01: return True elif abs(lat - 37.79) < .01 and abs(lon - -122.39) < .01: return True else: return False df = df[df.apply(lambda x: filter_values(x['lat'],x['lon']),axis=1)]