0Pricing
Pandas & NumPy Academy · Lección

Filtros isin() y between()

Seleccione filas cuyo valor de columna esté en una lista con isin() o dentro de un rango numérico con between().

Filtros isin() y between() es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

Descripción general del método isin()

isin() comprueba si cada elemento de una Series está contenido en una lista (o conjunto) de valores determinada. Devuelve una Series booleana que puede usar directamente para filtrar filas. Esta solución es más concisa y, a menudo, más rápida que encadenar varias comparaciones == con |.

Por ejemplo, en lugar de (df['country'] == 'USA') | (df['country'] == 'UK'), puede escribir df['country'].isin(['USA', 'UK']).

import pandas as pd

df = pd.DataFrame({
    'country': ['USA', 'Germany', 'UK', 'France', 'USA'],
    'sales': [400, 200, 150, 300, 600]
})

# Check membership
mask = df['country'].isin(['USA', 'UK'])
print(mask.tolist())  # [True, False, True, False, True]

result = df[mask]
print(result)
#   country  sales
# 0     USA    400
# 2      UK    150
# 4     USA    600

isin() con conjuntos para mejorar la velocidad

Puede pasar un conjunto de Python en lugar de una lista a isin(). La búsqueda de pertenencia en un conjunto tiene un coste O(1): no se vuelve más lenta a medida que crece la lista. Esto es importante cuando la lista de valores permitidos contiene miles de elementos, ya que isin() basado en conjuntos es considerablemente más rápido que isin() basado en listas.

import pandas as pd

df = pd.DataFrame({
    'sku': ['A001', 'B002', 'A003', 'C004', 'B005'],
    'qty': [10, 5, 3, 8, 12]
})

# Use a set for fast membership check
allowed_skus = {'A001', 'A003', 'B005'}
result = df[df['sku'].isin(allowed_skus)]
print(result)
#     sku  qty
# 0  A001   10
# 2  A003    3
# 4  B005   12

Negación de isin() con ~

Combine isin() con el operador ~ para filtrar las filas en las que una columna no contiene los valores especificados. Esta es la forma más clara de excluir una lista de valores concretos y resulta mucho más legible que crear una cadena de comparaciones !=.

import pandas as pd

df = pd.DataFrame({
    'status': ['active', 'cancelled', 'shipped', 'refunded', 'active'],
    'amount': [100, 200, 300, 150, 500]
})

bad_statuses = ['cancelled', 'refunded']
# Keep all rows NOT in the excluded list
result = df[~df['status'].isin(bad_statuses)]
print(result)
#     status  amount
# 0   active     100
# 2  shipped     300
# 4   active     500

isin() con una columna de DataFrame como lista

Un recurso muy útil consiste en pasar a isin() los valores de la columna de otro DataFrame. Esto equivale a una combinación semidireccional de SQL: conserva las filas de df1 cuya clave aparece en df2. A diferencia de una combinación completa, no duplica filas ni añade columnas adicionales; solo filtra.

import pandas as pd

orders = pd.DataFrame({
    'order_id': [1, 2, 3, 4, 5],
    'revenue': [100, 200, 300, 400, 500]
})

vip_orders = pd.DataFrame({'order_id': [2, 4]})

# Keep orders whose ID appears in vip_orders
result = orders[orders['order_id'].isin(vip_orders['order_id'])]
print(result)
#    order_id  revenue
# 1         2      200
# 3         4      400

Descripción general del método between()

between(left, right) devuelve una Series booleana que es True cuando los valores se encuentran dentro del rango cerrado [left, right] (inclusivo de forma predeterminada). Sustituye condiciones de dos extremos como (df['age'] >= 18) & (df['age'] <= 65) por una única llamada legible.

El parámetro inclusive controla la inclusión de los límites: 'both' (valor predeterminado), 'left', 'right' o 'neither'.

import pandas as pd

df = pd.DataFrame({
    'age': [15, 22, 35, 67, 45, 8]
})

# Select working-age population
result = df[df['age'].between(18, 65)]
print(result)
#    age
# 1   22
# 2   35
# 4   45

between() con el parámetro inclusive

De forma predeterminada, ambos extremos están incluidos en el rango. Al establecer inclusive='left', se excluye el límite derecho (resulta útil para intervalos semiabiertos, como los intervalos temporales); con inclusive='right', se excluye el izquierdo; y con inclusive='neither', se excluyen ambos extremos para obtener un intervalo abierto estricto.

import pandas as pd

df = pd.DataFrame({'score': [0, 50, 100, 75, 50]})

# Include only scores strictly between 50 and 100
strict = df[df['score'].between(50, 100, inclusive='neither')]
print(strict)
#    score
# 3     75

# Include 50 but not 100
left_closed = df[df['score'].between(50, 100, inclusive='left')]
print(left_closed)
#    score
# 1     50
# 3     75
# 4     50

between() en columnas de fechas

between() también funciona con columnas de fecha y hora. Pase cadenas de fecha u objetos Timestamp como límites, y Pandas realizará la comparación con los valores de fecha y hora subyacentes. Es una forma clara de seleccionar una ventana temporal sin convertir las fechas en enteros.

import pandas as pd

df = pd.DataFrame({
    'date': pd.to_datetime(['2024-01-01', '2024-06-15', '2024-11-20', '2025-03-01']),
    'value': [10, 20, 30, 40]
})

# Filter rows in the year 2024
result = df[df['date'].between('2024-01-01', '2024-12-31')]
print(result)
#         date  value
# 0 2024-01-01     10
# 1 2024-06-15     20
# 2 2024-11-20     30

Combinación de isin() y between()

Puede combinar isin() y between() en la misma expresión booleana mediante & y |. Esto crea filtros compactos y legibles que, de otro modo, requerirían muchas condiciones anidadas. Encierre siempre cada llamada entre paréntesis al combinarlas.

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'North', 'West'],
    'revenue': [100, 500, 200, 300, 400]
})

# Rows in North or South regions AND revenue between 200 and 400
result = df[
    df['region'].isin(['North', 'South']) &
    df['revenue'].between(200, 400)
]
print(result)
#    region  revenue
# 3   North      300
# 1   South      500  <- actually excluded (500 > 400)
# 3   North      300

isin() en varias columnas con Any

Cuando quiera comprobar si alguna de varias columnas contiene un valor de una lista, puede llamar a isin() en todo el DataFrame y usar .any(axis=1) para consolidar el resultado por filas. Esto resulta útil para buscar simultáneamente en varias columnas de etiquetas o categorías.

import pandas as pd

df = pd.DataFrame({
    'tag1': ['python', 'java', 'sql'],
    'tag2': ['sql', 'python', 'go'],
    'topic': ['Database', 'Backend', 'Infra']
})

target_langs = ['python', 'sql']
# Check if either tag column matches
mask = df[['tag1', 'tag2']].isin(target_langs).any(axis=1)
result = df[mask]
print(result)
#      tag1    tag2     topic
# 0  python     sql  Database
# 1    java  python   Backend
# 2     sql      go     Infra

Consejo de rendimiento: isin() frente a varios ==

Para una lista pequeña de 2 o 3 valores, la diferencia entre isin() y las condiciones == encadenadas es insignificante. Sin embargo, para listas grandes (de cientos de valores), isin() es mucho más rápido porque convierte internamente la lista en un conjunto hash y realiza búsquedas O(1) por elemento, en lugar de comparaciones secuenciales.

Prefiera siempre isin() a una cadena larga de condiciones | para obtener un código más limpio y un mejor rendimiento.

import pandas as pd
import numpy as np

# 1 million row DataFrame
df = pd.DataFrame({'id': np.random.randint(0, 10000, size=1_000_000)})

allowed = list(range(0, 500))  # 500 allowed IDs

# isin() is the right approach here — fast hash lookup
result = df[df['id'].isin(allowed)]
print(result.shape)  # around (50000, 1)

Filtro de un caso real: catálogo de productos

A continuación se muestra un ejemplo realista que combina isin() para filtrar por categoría y between() para filtrar por rango de precios, un patrón habitual en el análisis de comercio electrónico. Los dos filtros seleccionan exactamente el subconjunto de productos necesario para una promoción específica.

import pandas as pd

products = pd.DataFrame({
    'name': ['Laptop', 'Mouse', 'Monitor', 'Keyboard', 'Webcam'],
    'category': ['Computing', 'Accessories', 'Displays', 'Accessories', 'Peripherals'],
    'price': [1200, 25, 300, 80, 150]
})

# Products in Accessories or Peripherals, priced 50-200
eligible = products[
    products['category'].isin(['Accessories', 'Peripherals']) &
    products['price'].between(50, 200)
]
print(eligible)
#        name     category  price
# 3  Keyboard  Accessories     80
# 4    Webcam  Peripherals    150

Comprobación rápida

Compruebe cuánto comprende de los filtros isin() y between().

Resumen de la lección

En esta lección ha aprendido que isin() comprueba la pertenencia a un conjunto y es más rápido que encadenar varias condiciones ==; ~isin() excluye una lista de valores; y between() filtra un rango cerrado con un parámetro inclusive opcional. Ambos métodos funcionan con columnas numéricas, de cadenas y de fecha y hora. A continuación, exploraremos cómo seleccionar columnas de un DataFrame que coincidan con un patrón de nombre.

Preguntas frecuentes

¿La lección «Filtros isin() y between()» es gratis?

Sí — el texto completo de «Filtros isin() y between()» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Filtros isin() y between()»?

Seleccione filas cuyo valor de columna esté en una lista con isin() o dentro de un rango numérico con between(). Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Pandas & NumPy Academy?

No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Filtros isin() y between()»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?

Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Indexación booleana en DataFrames
  2. El método query()
  3. Filtros isin() y between()
  4. Seleccionar columnas por patrón
← Volver a Pandas & NumPy Academy