La regla que todos pasan por alto: cómo dejar de confundir loc e iloc en Pandas

Con los pandas, probablemente te hayas topado con esta confusión clásica: ¿deberías usar loc o iloc para extraer datos? A primera vista parecen casi idénticos. Ambos se utilizan para dividir, filtrar y recuperar filas o columnas de un DataFrame; sin embargo, una pequeña diferencia en cómo funcionan puede cambiar completamente sus resultados (o generar un error que lo deje rascándose la cabeza).

Recuerdo la primera vez que intenté seleccionar una fila con df.loc[0] y me pregunté por qué no funcionó. ¿La razón? Pandas no siempre “piensa” en términos de posiciones; a veces utiliza etiquetas. Ahí es donde entra en juego la distinción entre loc e iloc.

En este artículo, analizaré un miniproyecto sencillo utilizando un pequeño conjunto de datos sobre el rendimiento de los estudiantes. Al final, no sólo comprenderá la diferencia entre loc e iloc, sino que también sabrá exactamente cuándo utilizar cada uno en su propio análisis de datos.

Presentando el conjunto de datos

El conjunto de datos proviene de ChatGPT. Contiene algunos registros básicos de calificaciones de exámenes de estudiantes. Aquí hay una instantánea de nuestro conjunto de datos.

importar pandas como pd df = pd.read_csv(‘student_scores.csv’) df

Producción:

Intentaré realizar algunas tareas de extracción de datos usando loc e iloc, como

Extraer una sola fila del DataFrame Extraer un solo valor Extraer varias filas Cortar un rango de filas Extraer columnas específicas y
Filtrado booleano

Primero, déjame explicarte brevemente qué son loc e iloc en Pandas.

¿Qué es loc e iloc?

Loc e iloc son técnicas de extracción de datos en Pandas. Son muy útiles para seleccionar datos de registros.

Loc usa etiquetas para recuperar registros de un DataFrame, por lo que me resulta más fácil de usar. Iloc, sin embargo, es útil para una recuperación más precisa de registros, porque iloc selecciona datos basándose en las posiciones enteras de las filas y columnas, de forma similar a cómo indexaría una lista o matriz de Python.

Pero si eres como yo, quizás te lo preguntes. Si loc es claramente más fácil debido a las etiquetas de las filas, ¿por qué molestarse en usar iloc? ¿Por qué molestarse en intentar calcular los índices de las filas, especialmente si se trata de conjuntos de datos grandes? Aquí hay un par de razones.

Muchas veces, los conjuntos de datos no vienen con índices de filas ordenados (como 101, 102,…). En su lugar, tiene un índice simple (0, 1, 2,…), o puede escribir mal el etiquetado de las filas al recuperar registros. En este caso, será mejor que utilices iloc. Más adelante en este artículo, es algo que también abordaremos. En algunos escenarios, como el preprocesamiento del aprendizaje automático, las etiquetas realmente no importan. Sólo te importa una instantánea de los datos. Por ejemplo, los primeros o últimos tres registros. iloc es realmente útil en este escenario. iloc hace que el código sea más corto y menos frágil, especialmente si las etiquetas cambian, lo que podría dañar su modelo de aprendizaje automático. Muchos conjuntos de datos tienen etiquetas de fila duplicadas. En este caso, iloc siempre funciona ya que las posiciones son únicas. La conclusión es que utilice loc cuando su conjunto de datos tenga etiquetas claras y significativas y desee que su código sea legible. Utilice iloc cuando necesite control basado en la posición o cuando falten etiquetas o estén desordenadas.

Ahora que he aclarado las cosas, aquí está la sintaxis básica para loc e iloc a continuación:

df.loc[rows, columns]
df.iloc[rows, columns]

La sintaxis es prácticamente la misma. Con esta sintaxis, intentemos recuperar algunos registros usando loc e iloc.

Extrayendo una sola fila del DataFrame

Para hacer una demostración adecuada, primero cambiemos el índice de la columna y convirtámoslo en Student_id. Actualmente, pandas se indexa automáticamente:

# establecer Student_id como índice df.set_index(‘student_id’, inplace=True)

Aquí está el resultado:

Se ve mejor. Ahora, intentemos recuperar todos los registros de Bob. A continuación se explica cómo abordarlo utilizando loc:

df.loc[102]

Todo lo que hago aquí es especificar la etiqueta de la fila. Esto debería recuperar todos los registros de Bob.

Aquí está el resultado:

nombre Bob matemáticas 58 inglés 64 ciencias 70 Nombre: 102, tipo d: objeto

Lo bueno de esto es que puedo profundizar, como una jerarquía. Por ejemplo, intentemos recuperar información específica sobre Bob, como su puntuación en matemáticas.

df.loc[102, ‘math’]

El resultado sería 58.

Ahora intentemos esto usando iloc. Si está familiarizado con listas y matrices, la indexación siempre comienza en 0. Entonces, si quiero recuperar el primer registro en el DataFrame, tendré que especificar el índice 0. En este caso, estoy intentando recuperar a Bob, que es la segunda fila en nuestro DataFrame; entonces, en este caso, el índice sería 1.

df.iloc[1]

Obtendríamos el mismo resultado que el anterior:

nombre Bob matemáticas 58 inglés 64 ciencias 70 Nombre: 102, tipo d: objeto

Y si trato de profundizar y recuperar la puntuación de matemáticas de Bob. Nuestro índice también sería 1, dado que las matemáticas están en la segunda fila.

df.iloc[1, 1]

El resultado sería 58.

Muy bien, puedo concluir este artículo aquí, pero loc e iloc ofrecen algunas características más impresionantes. Repasemos rápidamente algunos de ellos.

Extraer varias filas (estudiantes específicos)

Pandas te permite recuperar varias filas usando loc e iloc. Voy a hacer una demostración recuperando los registros de varios estudiantes. En este caso, en lugar de almacenar un único valor en nuestro método loc/iloc, estaríamos almacenando una lista. Así es como puedes hacer eso con loc:

# Registros de Alice, Charlie y Edward df.loc[[101, 103, 105]]

Aquí está el resultado:

Y aquí se explica cómo hacerlo con iloc:

df.iloc[[0, 2, 4]]

Obtendríamos el mismo resultado:

Espero que lo estés dominando.

Cortar un rango de filas

Otra característica útil que ofrece Python Pandas es la capacidad de dividir una variedad de filas. Aquí puede especificar su posición inicial y final. Aquí está la sintaxis para el corte loc/iloc:

df.loc[start_label:end_label]

Sin embargo, en loc, la etiqueta final se incluiría en la salida, muy diferente del corte predeterminado de Python.

La sintaxis es la misma para iloc, con la excepción de que la etiqueta final se excluiría de la salida (al igual que la división predeterminada de Python).

Veamos un ejemplo:

Estoy intentando recuperar una variedad de registros de estudiantes. Intentemos eso usando loc:

df.loc[101:103]

Producción:

Como puede ver arriba, la etiqueta final se incluye en el resultado. Ahora, intentémoslo usando iloc. Si recuerdas, el índice de la primera fila sería 0, lo que significaría que la tercera fila sería 2.

df.iloc[0:3]

Producción:

Aquí se excluye la tercera fila. Pero si eres como yo (alguien que cuestiona mucho las cosas), quizás te preguntes: ¿por qué querrías que se excluya la última fila? ¿En qué escenarios sería útil? ¿Y si te dijera que realmente te hace la vida más fácil? Aclaremos eso muy rápido.

Suponiendo que desea procesar su DataFrame en fragmentos de 100 filas cada uno.

Si el corte fuera inclusivo, tendrías que hacer algunos cálculos incómodos para evitar repetir la última fila.

Pero debido a que el corte es exclusivo al final, puedes hacerlo con bastante facilidad, así.

df.iloc[0:100] # primeras 100 filas df.iloc[100:200] # siguientes 100 filas df.iloc[200:300] # siguientes 100 filas

Aquí no habrá superposiciones y habrá tamaños de fragmentos consistentes. Otra razón es que es similar a cómo funcionan los rangos en Pandas. Por lo general, cuando desea recuperar un rango de filas, también comienza en 0 y no incluye la última fila. Tener esta misma lógica en el corte de iloc es realmente útil, especialmente cuando estás trabajando en un web scraping o recorriendo una variedad de filas.

Extraer columnas específicas (temas)

También me encantaría presentarles los dos puntos: signo. Esto le permite recuperar todos los registros en su DataFrame usando loc. Similar al * en SQL. Lo bueno de esto es que puedes filtrar y extraer un subconjunto de columnas.

Por lo general, aquí es donde empiezo. Lo uso para obtener una descripción general de un conjunto de datos en particular. A partir de ahí, puedo empezar a filtrar y profundizar. Déjame mostrarte lo que quiero decir.

Recuperemos todos los registros:

df.loc[:]

Producción:

Desde aquí, puedo extraer columnas específicas como esta. Con ubicación:

df.loc[:, [‘math’, ‘science’]]

Producción:

Con iloc:

df.iloc[:, [2, 4]]

La salida sería la misma.

Me encanta esta característica porque es muy flexible. Digamos que quiero recuperar los puntajes de matemáticas y ciencias de Alice y Bob. Será algo como esto. Puedo simplemente especificar el rango de registros y columnas que quiero.

Con ubicación:

df.loc[101:103, [‘name’, ‘math’, ‘science’]]

Producción:

Con iloc:

df.iloc[0:3, [0, 1, 3]]

Obtendríamos el mismo resultado.

Filtrado Booleano (¿Quién obtuvo una puntuación superior a 80 en Matemáticas?)

La última característica que quiero compartir con ustedes es el filtrado booleano. Esto permite una extracción más flexible. Digamos que quiero recuperar los registros de los estudiantes que obtuvieron puntuaciones superiores a 80 en Matemáticas. Normalmente, en SQL, tendrás que utilizar las cláusulas WHERE y HAVING. Python hace que esto sea muy fácil.

# Estudiantes con Matemáticas > 80. df.loc[df[‘math’] > 80]

Producción:

También puede filtrar según múltiples condiciones utilizando los operadores AND(&), OR(|) y NOT(~). Por ejemplo:

# Matemáticas > 70 y Ciencias > 80 df.loc[(df[‘math’] > 70) y (gl[‘science’] > 80)]

Producción:
PD: Escribí un artículo sobre filtrado con Pandas. Puedes leerlo aquí

Por lo general, utilizará esta función con loc. Puede resultar un poco complicado con iloc, ya que no admite condiciones booleanas. Para hacer esto con iloc, tendrás que convertir el filtrado booleano en una lista, así:

# Estudiantes con Matemáticas > 80. df.iloc[list(df[‘math’] > 80)]

Para evitar el dolor de cabeza, simplemente vaya con loc.

Conclusión

Probablemente usarás mucho los métodos loc e iloc cuando trabajes en un conjunto de datos. Por eso es crucial saber cómo funcionan y distinguirlos. Me encanta lo fácil y flexible que es extraer registros con estos métodos. Siempre que esté confundido, recuerde que loc se trata de etiquetas, mientras que iloc se trata de posiciones.

Espero que este artículo te haya resultado útil. Intente ejecutar estos ejemplos en su propio conjunto de datos para ver la diferencia en acción.

Escribo estos artículos como una forma de probar y fortalecer mi propia comprensión de los conceptos técnicos y de compartir lo que estoy aprendiendo con otras personas que podrían estar en el mismo camino. Siéntete libre de compartir con otros. Aprendamos y crezcamos juntos. ¡Salud!

No dudes en saludar en cualquiera de estas plataformas.

Medio

LinkedIn

Gorjeo

YouTube