varias una seleccionar filas fila extraer columnas columna python pandas

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



seleccionar una fila de un dataframe pandas (7)

Estoy tratando de modificar un DataFrame df para que solo contenga filas para las que los valores en la columna closing_price estén entre 99 y 101 y trato de hacer esto con el siguiente código.

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)]


Considere también series entre :

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


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

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


En lugar de esto

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

Deberías usar esto

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

Tenemos que usar los operadores lógicos bit a bit de NumPy |, &, ~, ^ para consultas compuestas. 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, se filtra un marco de datos 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)]


hay una alternativa mejor: use el método query() :

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 sintaxis aquí, pero me caí al intentar combinar con expresison; 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


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


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'')