Saltar al contenido principal

Iloc vs Loc en Pandas: Una guía con ejemplos

.loc selecciona los datos utilizando nombres de filas y columnas (etiquetas), mientras que .iloc utiliza índices numéricos (posiciones). Aprende a utilizar ambos con ejemplos.
Actualizado 21 nov 2024  · 8 min de lectura

Una de esas cosas molestas que todos intentamos averiguar cuando aprendemos Pandas es la distinción entre .loc y .iloc.

Acabemos con esta confusión y aclaremos la diferencia entre estos dos métodos. Daré muchos ejemplos, y espero que la distinción esté mucho más clara al final de este blog.

¿Qué son .loc e .iloc en Pandas?

Tanto .loc como .iloc son atributos esenciales de Pandas DataFrames, y ambos se utilizan para seleccionar subconjuntos específicos de datos. Su finalidad es acceder y permitir la manipulación de una parte concreta del Marco de Datos en lugar de todo el Marco de Datos. 

Función

.loc

.iloc

Syntax

df.loc[row_indexer, column_indexer]

df.iloc[row_indexer, column_indexer]

Método de indexación

Indexación basada en etiquetas

Indexación basada en la posición

Utilizado como referencia

Etiquetas (nombres) de filas y columnas

Índices numéricos de filas y columnas (empezando por 0)

Como podemos ver en la tabla , la sintaxis es muy similar. La diferencia radica en cómo utilizamos los argumentos row_indexer y column_indexer. Esto se debe a que los dos métodos ofrecen enfoques diferentes para indexar los datos: mientras que .loc indexa basándose en los nombres de las etiquetas, .iloc toma como argumentos el índice numérico de posición de filas y columnas.

Examinemos detalladamente cada uno de los dos métodos, empezando por .loc.

Utilizando .loc: Selección por etiquetas

Para ilustrar los conceptos, consideremos una hipotética base de datos de clientes representada por este DataFrame llamado df, con el Customer ID representando el índice de fila:

Identificación del cliente

Nombre

País

Región

Edad

C123

John Doe

Estados Unidos

Norteamérica

67

C234

Petra Müller

Alemania

Europa

51

C345

Ali Khan

Pakistán

Asia

19

C456

Maria Gonzalez

México

Norteamérica

26

C567

David Lee

China

Asia

40

En hay cuatro formas principales de seleccionar filas con .loc. Entre ellas están:

  • Seleccionar una sola fila
  • Seleccionar varias filas
  • Seleccionar una porción de filas
  • Selección condicional de filas

Seleccionar una sola fila con .loc

Para seleccionar una sola fila, utilizamos la etiqueta de la fila que queremos recuperar como row_indexer. En consecuencia, la sintaxis es la siguiente: df.loc['row_label']. Vamos a utilizarlo para mostrar toda la información sobre nuestro cliente Ali Khan:

df.loc['C345']

C345

 

Nombre

Ali Khan

País

Pakistán

Región

Asia

Edad

19

Seleccionar varias filas con .loc

Si queremos seleccionar varias filas que no se siguen necesariamente en orden, tenemos que pasar una lista de sus etiquetas de fila como argumento row_indexer. Esto significa que tenemos que utilizar no uno, sino dos pares de corchetes: uno para la sintaxis normal de .loc y otro para la lista de etiquetas.

La línea df.loc[['row_label_1', 'row_label_2']] devolverá las dos filas del DataFrame df especificadas en la lista. Supongamos que queremos conocer no sólo la información sobre Ali Khan, sino también sobre David Lee:

df.loc[['C345', 'C567']]

Identificación del cliente

Nombre

País

Región

Edad

C345

Ali Khan

Pakistán

Asia

19

C567

David Lee

China

Asia

40

Seleccionar una porción de filas con .loc

Podemos seleccionar un rango de filas pasando las etiquetas de la primera y la última fila con dos puntos entre ellas: df.loc['row_label_start':'row_label_end']. Podríamos mostrar las cuatro primeras filas de nuestro DataFrame así:

df.loc['C123' : 'C456']

Identificación del cliente

Nombre

País

Región

Fecha de inscripción

C123

John Doe

Estados Unidos

Norteamérica

67

C234

Petra Müller

Alemania

Europa

51

C345

Ali Khan

Pakistán

Asia

19

C456

Maria Gonzalez

México

Norteamérica

26

Aquí hay que tener en cuenta dos cosas:

  1. La salida incluye la fila especificada en row_label_end. Esto es diferente en .iloc, que trataremos más adelante.
  2. Sólo utilizamos un par de corchetes, aunque queramos recuperar varias filas. No utilizamos una lista para especificar las distintas filas, por lo que utilizar dos corchetes devolvería un SyntaxError.

Selección condicional de filas mediante .loc

También podemos devolver filas basándonos en una expresión condicional. Podemos filtrar todas las filas según cumplan o no una determinada condición y mostrar sólo las que la cumplan.

La sintaxis correspondiente es df.loc[conditional_expression], siendo conditional_expression una declaración sobre los valores permitidos en una columna concreta.

Para columnas con datos no numéricos (como Name o Country), la declaración sólo puede utilizar el operador igual o desigual, ya que no hay orden entre los valores. Podríamos, por ejemplo, devolver todas las filas de clientes que no sean de Asia:

df.loc[df['Region'] != 'Asia']

Identificación del cliente

Nombre

País

Región

Edad

C123

John Doe

Estados Unidos

Norteamérica

67

C234

Petra Müller

Alemania

Europa

51

C456

Maria Gonzalez

México

Norteamérica

26

Seleccionar una sola columna con .loc

Para seleccionar columnas, tenemos que especificar el argumento column_indexer, que viene después del argumento row_indexer. Si sólo queremos especificar la column_indexer, tenemos que marcar de alguna manera que queremos devolver todas las filas y sólo filtrar por las columnas. ¡Veamos cómo podemos hacerlo!

Puedes seleccionar una sola columna especificando en column_indexerla etiqueta de la columna correspondiente. Para recuperar todas las filas, tenemos que especificar la dirección row_indexer con dos puntos simples. Llegamos a una sintaxis que tiene este aspecto: df.loc[:, 'column_name'].

Vamos a mostrar la Name de cada cliente:

df.loc[:, 'Name']

Identificación del cliente

Nombre

C123

John Doe

C234

Petra Müller

C345

Ali Khan

C456

Maria Gonzalez

C567

David Lee

Seleccionar varias columnas con .loc

De forma similar a la selección de varias filas, tenemos que pasar una lista de etiquetas de columnas si queremos devolver varias columnas de un DataFrame que no se sucedan necesariamente en orden: df.loc[:, [col_label_1, 'col_label_2']].

Suponiendo que quisiéramos añadir el Age de todos los clientes a nuestra última salida, funcionaría así:

df.loc[:, ['Name', 'Age']]

Identificación del cliente

Nombre

Edad

C123

John Doe

67

C234

Petra Müller

51

C345

Ali Khan

19

C456

Maria Gonzalez

26

C567

David Lee

40

Seleccionar una porción de columnas con .loc

Si utilizas dos puntos entre las etiquetas de dos columnas, se seleccionarán todas las columnas del rango de orden comprendido entre las dos columnas especificadas. Incluye la columna final, lo que significa que la columna llamada col_end también se seleccionará en la sintaxis estándar, que es la siguiente: df.loc[:, 'col_start':'col_end'].

Si nos interesaran los Name, Country, y Region de nuestros clientes, nuestra línea de código podría ser:

df.loc[:, 'Name':'Region']

Identificación del cliente

Nombre

País

Región

C123

John Doe

Estados Unidos

Norteamérica

C234

Petra Müller

Alemania

Europa

C345

Ali Khan

Pakistán

Asia

C456

Maria Gonzalez

México

Norteamérica

C567

David Lee

China

Asia

Selección combinada de filas y columnas mediante .loc

También es posible especificar tanto el row_indexer como el column_indexer. Se puede utilizar para recuperar una única información, es decir, una celda del Marco de datos. Para ello, especificamos una fila y una columna utilizando la sintaxis df.loc['row_label', 'column_name'] .

El caso más útil es devolver un sub-DataFrame que se centre exactamente en el conjunto de filas y columnas que nos interesan. Es posible especificar ambos indexadores como listas utilizando los corchetes, o como una rebanada utilizando los dos puntos, e incluso combinarlo con una expresión condicional para la selección de filas.

He aquí un ejemplo de devolución de Name, Country, y Region de cada cliente con un Age superior a 30:

df.loc[df['Age'] > 30, 'Name':'Region']

Identificación del cliente

Nombre

País

Región

C123

John Doe

Estados Unidos

Norteamérica

C234

Petra Müller

Alemania

Europa

C567

David Lee

China

Asia

Utilizando .iloc: Selección por posición entera

.iloc selecciona por posición en lugar de por etiqueta. Esta es la sintaxis estándar para utilizar .iloc: df.iloc[row_indexer, column_indexer]. Hay dos cosas especiales que debes tener en cuenta:

  • Cuenta a partir de 0: La primera fila y columna tienen el índice 0, la segunda el índice 1, etc.
  • Exclusividad del valor final de rango: Al utilizar un corte, la fila o columna especificada tras los dos puntos no se incluye en la selección.

Seleccionar una sola fila con .iloc

Se puede seleccionar una sola fila utilizando el número entero que representa el número de índice de la fila como row_indexer. No necesitamos comillas ya que estamos introduciendo un número entero y no una cadena de etiquetas como hicimos con .loc. Para devolver la primera fila de un DataFrame llamado df, introduce df.iloc[0].

En nuestro DataFrame de ejemplo, esta misma línea de código devuelve la información de John Doe:

df.iloc[0]

C123

 

Nombre

John Doe

País

Estados Unidos

Región

Norteamérica

Edad

67

Seleccionar varias filas con .iloc

La selección de varias filas funciona en .iloc como en .loc-introducimos los números enteros del índice de fila en una lista con corchetes. La sintaxis es la siguiente: df.iloc[[0, 3, 4]].

A continuación puedes ver el resultado correspondiente en nuestra tabla de clientes:

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

Identificación del cliente

Nombre

País

Región

Edad

C123

John Doe

Estados Unidos

Norteamérica

67

C456

Maria Gonzalez

México

Norteamérica

26

C567

David Lee

China

Asia

40

Seleccionar una porción de filas con .iloc

Para seleccionar una porción de filas, utilizamos dos puntos entre dos enteros de índice de fila especificados. Ahora, tenemos que prestar atención a la exclusividad mencionada anteriormente. 

Podemos tomar como ejemplo la línea df.iloc[1:4] para ilustrar este concepto. El índice número 1 significa la segunda fila, por lo que nuestro corte empieza ahí. El índice entero 4 representa la quinta fila, pero como .iloc no es inclusivo para la selección de trozos, nuestra salida incluirá todas las filas hasta la última antes de ésta. Por tanto, devolverá la segunda, tercera y cuarta fila. 

Probemos que la línea funciona como debe:

df.iloc[1:4]

Identificación del cliente

Nombre

País

Región

Edad

C234

Petra Müller

Alemania

Europa

51

C345

Ali Khan

Pakistán

Asia

19

C456

Maria Gonzalez

México

Norteamérica

26

Seleccionar una sola columna con .iloc

La lógica de selección de columnas mediante .iloc sigue lo que hemos aprendido hasta ahora. Veamos cómo funciona para columnas únicas, columnas múltiples y trozos de columna.

Al igual que con .loc, es importante especificar el row_indexer antes de poder pasar al column_indexer. Para recuperar los valores de la tercera columna de df para cada fila, introducimos df.iloc[:, 2].

Como Region es la tercera columna de nuestro DataFrame, se recuperará como consecuencia de esa línea de código:

df.iloc[:, 2]

Identificación del cliente

Región

C123

Norteamérica

C234

Europa

C345

Asia

C456

Norteamérica

C567

Asia

Seleccionar varias columnas con .iloc

Para seleccionar varias columnas que no sean necesariamente consecutivas, podemos introducir de nuevo una lista que contenga números enteros como column_indexer. La línea df.iloc[:, [0, 3]] devuelve tanto la primera como la cuarta columna. 

En nuestro caso, la información mostrada es la Name así como la Age de cada cliente:

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

Identificación del cliente

Nombre

Edad

C123

John Doe

67

C234

Petra Müller

51

C345

Ali Khan

19

C456

Maria Gonzalez

26

C567

David Lee

40

Seleccionar una porción de columnas con .iloc

Para la selección de rodajas mediante .iloc, la lógica de column_indexer sigue a la de row_indexer. La columna representada por el número entero después de los dos puntos no se incluye en la salida. Para recuperar la segunda y la tercera columna, la línea de código debe ser como sigue: df.iloc[:, 1:3].

Esta línea devuelve toda la información geográfica que tenemos sobre nuestros clientes:

df.iloc[:, 1:3]

Identificación del cliente

País

Región

C123

Estados Unidos

Norteamérica

C234

Alemania

Europa

C345

Pakistán

Asia

C456

México

Norteamérica

C567

China

Asia

Selección combinada de filas y columnas mediante .iloc

Podemos unir lo que hemos aprendido sobre .iloc para combinar la selección de filas y columnas. De nuevo, es posible devolver una sola celda o un sub-DataFrame. Para devolver la única celda en la intersección de la fila 3 y la columna 4, introducimos df.iloc[2, 3].

Al igual que con .loc, podemos especificar ambos indexadores como listas utilizando los corchetes, o como trozos utilizando los dos puntos. Si queremos seleccionar filas utilizando expresiones condicionales, eso también es técnicamente posible con .iloc, pero no se recomienda. Utilizar los nombres de las etiquetas y .loc suele ser mucho más intuitivo y menos propenso a errores.

Este último ejemplo muestra Country, Region y Age para la primera, segunda y quinta fila de nuestro DataFrame:

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

Identificación del cliente

País

Región

Edad

C123

Estados Unidos

Norteamérica

67

C234

Alemania

Europa

51

C567

China

Asia

40

.iloc frente a .loc: Cuándo utilizar cuál

En general, hay una regla empírica sencilla en la que la elección del método depende de tu conocimiento del Marco de datos:

  • Utiliza .loc cuando conozcas las etiquetas (nombres) de las filas/columnas.
  • Utiliza .iloc cuando conozcas las posiciones enteras de las filas/columnas.

Algunos escenarios favorecen .loc o .iloc por su naturaleza. Por ejemplo, iterar sobre filas o columnas es más fácil e intuitivo utilizando enteros que etiquetas. Como ya hemos dicho, filtrar filas basándose en condiciones sobre los valores de las columnas es menos propenso a errores utilizando los nombres de las etiquetas de las columnas.

Escenarios favorables al .loc

Escenarios favorables al .iloc

Tu DataFrame tiene nombres de índice/columna significativos.

Estás iterando sobre filas/columnas por su posición.

Necesitas filtrar basándote en condiciones sobre los valores de las columnas.

Los nombres de índice/columna no son relevantes para tu tarea.

Error de clave, error de nombre y error de índice con .loc e .iloc

Veamos los posibles problemas. Un escollo común al utilizar .loc es encontrarse con un KeyError. Este error se produce cuando intentamos acceder a una etiqueta de fila o columna que no existe en nuestro DataFrame. Para evitarlo, siempre tenemos que asegurarnos de que las etiquetas que utilizamos son correctas y de que coinciden con las etiquetas existentes en tu DataFrame, y comprobar dos veces si hay errores tipográficos.

Además, es importante utilizar siempre comillas para las etiquetas especificadas mediante .loc. Olvidarlos te devolverá un NameError.

Se puede producir un IndexError al utilizar .iloc si especificamos una posición entera que está fuera del rango válido de los índices de nuestro DataFrame. Esto ocurre cuando el índice al que intentas acceder no existe, ya sea porque supera el número de filas o columnas de tu Marco de datos o porque es un valor negativo. Para evitar este error, comprueba las dimensiones de tu Marco de datos y utiliza valores de índice adecuados dentro del rango válido.

Conclusión

Espero que este blog te haya sido útil y que la distinción entre .loc y .iloc esté ya clara. Para saber más, aquí tienes unos buenos pasos a seguir:


Photo of Tom Farnschläder
Author
Tom Farnschläder
LinkedIn

Tras construir una base sólida en economía, derecho y contabilidad en mis estudios duales en la administración financiera regional, entré en contacto por primera vez con la estadística en mis estudios de ciencias sociales y mi trabajo como tutora. Realizando análisis empíricos cuantitativos, descubrí una pasión que me llevó a continuar mi viaje adentrándome en el hermoso campo de la ciencia de datos y a aprender herramientas analíticas como R, SQL y Python. Actualmente, estoy mejorando mis habilidades prácticas en Deutsche Telekom, donde puedo recibir mucha experiencia práctica en la codificación de rutas de datos para importar, procesar y analizar datos utilizando Python.

Temas

¡Aprende Pandas con estos cursos!

curso

Data Manipulation with pandas

4 hr
415.4K
Learn how to import and clean data, calculate statistics, and create visualizations with pandas.
Ver detallesRight Arrow
Comienza El Curso
Ver másRight Arrow
Relacionado

tutorial

Tutorial seleccionar columnas con Python

Utiliza Python Pandas y selecciona columnas de los DataFrames. ¡Sigue nuestro tutorial con ejemplos de código y aprende hoy mismo distintas formas de seleccionar tus datos!
DataCamp Team's photo

DataCamp Team

7 min

tutorial

Tutorial de Pandas: DataFrames en Python

Explora el análisis de datos con Python. Los DataFrames de Pandas facilitan la manipulación de tus datos, desde la selección o sustitución de columnas e índices hasta la remodelación de tus datos.
Karlijn Willems's photo

Karlijn Willems

20 min

tutorial

Tutorial pandas read_csv(): importación de datos

La importación de datos es el primer paso importante en cualquier proyecto de ciencia de datos. Aprende por qué los científicos de datos actuales prefieren la función pandas read_csv() para hacerlo.
Kurtis Pykes 's photo

Kurtis Pykes

9 min

tutorial

Matrices en Python

Matrices en Python con ejemplos de código. Aprende a crear e imprimir matrices con Python NumPy hoy mismo.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

Tutorial de list index() de Python

En este tutorial, aprenderás exclusivamente sobre la función index().
Sejal Jaiswal's photo

Sejal Jaiswal

6 min

tutorial

Tutorial de unión de DataFrames en pandas

En este tutorial, usted aprenderá varias maneras en las que múltiples DataFrames pueden ser fusionados en python usando la librería Pandas.
DataCamp Team's photo

DataCamp Team

19 min

See MoreSee More