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