Ir al contenido
wannacode

Seleccionar: [], loc e iloc

En resumen: En pandas [] selecciona columnas, loc selecciona filas y celdas por etiqueta, e iloc las selecciona por posición.

Problema

«El queso sube de precio»

El proveedor sube el precio del queso blanco de 7,90 € a 8,40 €. El gerente quiere tres cosas:

  • una tabla pequeña para el mostrador con solo el nombre y el precio;
  • el precio y el stock de un producto, sin buscar a ojo;
  • el precio nuevo en la tabla, no en alguna copia aparte.

Esto es seleccionar: tomar una parte de la tabla, columnas, filas o una celda, y a veces cambiarla. pandas tiene tres herramientas para ello: [], loc e iloc.

La idea

Columnas: []

Ya tomas una columna con []. Si pones una lista de nombres entre los corchetes, obtienes una tabla con esas columnas, en ese orden:

Pythondatos: las tablas de la tienda

Un nombre da una Serie con forma (25,). Una lista da un DataFrame con forma (25, 2), aunque la lista tenga una columna: products[['price']] es una tabla. Los corchetes dobles no son una sintaxis especial: los de fuera son para seleccionar, y los de dentro son para la lista.

La idea

Por etiqueta: loc

loc selecciona por etiquetas: primero las filas, luego las columnas, separadas por una coma. Con los nombres en el índice esto es «fila Queso blanco, columna price»:

Pythondatos: las tablas de la tienda
  • Una fila y una columna dan una celda: 7.9.
  • Una fila sola da la fila entera como Serie. Sus etiquetas son ahora los nombres de las columnas.
  • Las listas dan una tabla: el queso y la mantequilla con precio y stock.

Míralo

Un slice con loc incluye el final

Un slice con dos puntos (inicio:fin) funciona también en loc, pero hay una diferencia que confunde a todos:

Pythondatos: las tablas de la tienda

loc[0:3] da 4 nombres: de la etiqueta 0 a la etiqueta 3 inclusive. Un slice de posiciones (iloc, listas de Python) se detiene antes del final y da 3.

La razón son las etiquetas. Con nombres en el índice, loc['Leche fresca':'Mantequilla'] da los lácteos, de la leche a la mantequilla. Nadie querría dejar fuera la mantequilla solo porque está escrita al final. ¿Cómo escribirías «hasta justo después de la mantequilla»?

La idea

Por posición: iloc

iloc selecciona por posición, como un arreglo de NumPy: la primera fila es 0, la última es -1. Las etiquetas no intervienen:

Pythondatos: las tablas de la tienda

iloc[0, 1] es la primera fila, segunda columna: «Pan blanco». iloc[-1, 1] es el último producto: la tarjeta de regalo. iloc[:3, [1, 3]] son las tres primeras filas, las columnas en los lugares 1 y 3.

¿Cuál cuándo? loc cuando sabes lo que buscas: un producto, una columna por nombre. iloc cuando te importa el lugar: los 5 primeros, la última fila. Las posiciones se mueven en cuanto la tabla se ordena o se recorta, mientras que las etiquetas se quedan.

1. El índice es el de por defecto (0, 1, 2…). ¿Cuántas filas dan products.loc[2:5] y products.iloc[2:5]?

Pruébalo

Café en el almacén

El café es el producto con id 17. ¿Cuántos paquetes hay en stock? Pon id en el índice (by_id) y guarda el stock en coffee_stock como un solo número.

Pythondatos: las tablas de la tienda

La idea

Una copia o la misma tabla

Ahora el precio nuevo. Recortas los lácteos y cambias en ellos el precio del queso. ¿Cambia products?

Pythondatos: las tablas de la tienda

No: en dairy el queso es 8.4, pero en products sigue siendo 7.9. En pandas 3 cada trozo recortado se comporta como una copia. Cambiar el trozo no toca el original. Esto se llama Copy-on-Write: pandas no copia los datos enseguida, solo cuando uno de los dos objetos cambia.

Para cambiar la tabla, escribes en la tabla misma, con loc y la fila y la columna a la vez: products.loc[6, 'price'] = 8.4.

Míralo

Dos corchetes seguidos no escriben

La tentación es products['price'][6] = 8.4: la columna, luego la celda. Se parece a loc, pero no lo es:

Pythondatos: las tablas de la tienda

El precio sigue siendo 7.9. products['price'] es un objeto aparte, una copia, y [6] = 8.4 escribe en ella. Esto se llama asignación encadenada (chained assignment). pandas 3 nunca la aplica a la tabla y muestra un aviso ChainedAssignmentError con una pista sobre .loc.

Hay una regla: escribes con un solo loc[fila, columna] = … sobre la tabla que quieres cambiar.

Más precisamente, para curiosos

En pandas 1 y 2 el mismo código a veces cambiaba la tabla y a veces no, según hubiera debajo una copia o una vista. Por eso existía un SettingWithCopyWarning, que decía «quizá». Lo encontrarás en artículos viejos y en respuestas por internet. En pandas 3 (2026) la regla es clara, y el aviso es historia. Si tu código tiene que funcionar también en una versión vieja, loc en un solo paso también es correcto allí.

La idea

Muchas filas a la vez: una máscara en loc

En el lugar de las filas de loc puedes poner una máscara: una columna de True y False, como las máscaras de NumPy. Entonces el cambio se aplica a cada fila donde la máscara es True. Dos productos están agotados y llega una entrega de 30 para cada uno:

Pythondatos: las tablas de la tienda

empty.sum() cuenta los vacíos: 2. Después de la línea con loc, la banitsa y los pepinos tienen 30 cada uno. Usaremos mucho las máscaras sobre una tabla en la próxima lección, sobre filtros.

Pruébalo

Una entrega para los casi vacíos

Cada producto con menos de 10 en stock recibe 20 más. Guarda la máscara en low, y luego cambia su stock en products.

Pythondatos: las tablas de la tienda

Ejercicio

La tabla para el mostrador

Los nombres están en el índice de by_name. Cambia en by_name el precio de Queso blanco a 8.4. Luego guarda en counter la tabla para el mostrador: los lácteos de Leche fresca a Mantequilla, con las columnas price y stock.

Pythondatos: las tablas de la tienda

Test

Ponte a prueba

1. ¿Cuál devuelve una tabla (DataFrame) con las columnas name y price?
2. El índice son los nombres de los productos. ¿Qué da by_name.loc['Queso blanco', 'price']?
3. products.loc[17, 'stock'] da 33, pero el café (id 17) tiene 15 paquetes. ¿Por qué?
4. En pandas 3: short = products.loc[low], luego short['stock'] = 30. ¿Qué pasa con products?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·