Ir al contenido
wannacode

Series y DataFrame

En resumen: En pandas una Serie es una columna con etiquetas y un DataFrame es una tabla de esas columnas; el índice lleva los nombres de las filas y alinea la aritmética por ellos.

Problema

«¿Cuánto dinero hay en el almacén?»

El gerente pregunta cuánto vale el stock del almacén. La respuesta es precio por stock de cada producto, y luego una suma. Después querrá ver el número de un producto, por nombre.

Con NumPy ya lo puedes calcular. Pero en la lección de resúmenes argmax devolvía 22, una posición, y tenías que sacar el nombre de un arreglo names aparte. Si ordenas un arreglo y olvidas el otro, los nombres y los números se separan y nadie lo nota.

pandas guarda una etiqueta junto a cada número: de qué producto es. En esta lección verás cómo.

La idea

Una columna con etiquetas: Serie

Una Serie es un arreglo de NumPy con una etiqueta junto a cada valor. Las etiquetas se llaman el índice. Aquí hay tres precios con los nombres de los productos como índice:

Pythondatos: las tablas de la tienda

prices['Queso blanco'] da 7.9: el valor se toma por etiqueta, no por lugar. prices.index muestra las etiquetas, y to_numpy() da los números desnudos como arreglo.

La idea

Una tabla de columnas: DataFrame

Un DataFrame son varias Series con un índice compartido, una al lado de otra. Cada columna tiene un nombre y su propio tipo. Lo viste en el primer vistazo; ahora míralo pieza por pieza:

Pythondatos: las tablas de la tienda
  • columns son los nombres de las columnas: 6.
  • index es un RangeIndex de 0 a 24: read_csv numera las filas desde 0 si no le dices otra cosa. La columna id es otra cosa y empieza en 1.
  • dtypes es el tipo de cada columna. int64 y float64 son números, str es texto.

Míralo

Una columna es una Serie

Tomas una columna con su nombre entre corchetes, como en el primer vistazo. El resultado es una Serie:

Pythondatos: las tablas de la tienda

A la izquierda está el índice de la tabla (0, 1, 2), y abajo el nombre de la columna (Name: price) y su tipo. Todo lo que puedes hacer con una Serie lo puedes hacer con cada columna.

1. ¿Qué es products['stock']?

La idea

Nombres en el índice: set_index

Los números del 0 al 24 no le dicen nada al gerente. set_index('name') convierte la columna name en el índice: los nombres de los productos pasan a ser las etiquetas de las filas.

Pythondatos: las tablas de la tienda

Ahora el stock de café es by_name['stock']['Café en grano']: 15 paquetes. Y el producto más caro es una respuesta con nombre:

  • argmax() sigue dando la posición: 22.
  • idxmax() da la etiqueta del mayor valor: «Juego de cuchillos». También existe idxmin().

Las etiquetas viajan con los números: hagas lo que hagas con una Serie, el nombre se queda junto al precio.

La idea

Y de vuelta: reset_index

set_index no cambia products; devuelve una tabla nueva. La columna name es ahora su índice, así que hay 5 columnas en lugar de 6. reset_index() vuelve a convertir el índice en una columna normal y numera las filas desde 0 otra vez:

Pythondatos: las tablas de la tienda

Qué va en el índice depende de la pregunta. Para «por nombre» pones ahí los nombres; para una tabla normal que vas a escribir en un archivo, los vuelves a convertir en una columna.

Pruébalo

El producto más barato

¿Qué producto es el más barato? Pon los nombres en el índice (by_name), y guarda en cheapest el nombre del producto con el menor precio.

Pythondatos: las tablas de la tienda

Míralo

El índice alinea la aritmética

El proveedor manda una lista de precios nueva. Los productos son los mismos, pero en otro orden. Con arreglos de NumPy restarías el primero del primero y el segundo del segundo. Con Series, pandas resta los valores con la misma etiqueta, estén donde estén:

Pythondatos: las tablas de la tienda

Con Series, el café subió 1 €, el pan 0,10 € y el queso 0,50 €. Con los arreglos el primer número es 13,70 €: el precio nuevo del café menos el precio viejo del pan. El último es -12,30 €: la leche menos el café. Los números parecen perfectamente serios y están mal.

Esto se llama alineación por índice. El resultado queda ordenado por etiqueta, alfabéticamente.

Míralo

Una etiqueta que falta

Si una etiqueta está solo en una de las Series, pandas no tiene con qué calcularla:

Pythondatos: las tablas de la tienda

El queso blanco está solo en esta semana, así que su diferencia es NaN. Es honesto: no sabemos cuánto queso vendimos la semana pasada. Viste en los resúmenes que faltante no es cero, y pandas lo respeta.

Más precisamente, para curiosos

Si sabes que faltante significa cero (un producto que no vendimos la semana pasada), dilo explícitamente: this_week.sub(last_week, fill_value=0). Así la decisión se ve en el código, no queda escondida. La alineación vale para +, -, *, / y para las comparaciones entre dos Series.

Pruébalo

Qué subió

Las dos listas de precios están en distinto orden. Guarda en change cuánto cambió el precio de cada producto (nuevo menos viejo), redondeado a 2 decimales, con los nombres de los productos en el índice.

Pythondatos: las tablas de la tienda

Ejercicio

El stock del almacén

Responde al gerente. Pon los nombres de los productos en el índice. Guarda en stock_value el valor del stock de cada producto (precio por stock), en total su suma, y en real_total la suma sin la tarjeta de regalo, redondeada a 2 decimales.

Pythondatos: las tablas de la tienda

Test

Ponte a prueba

1. La tabla products se leyó con read_csv. ¿Qué es products.index?
2. Después de by_name = products.set_index('name'), ¿qué dan by_name['price'].argmax() y by_name['price'].idxmax()?
3. La semana this_week tiene Queso blanco y last_week no. ¿Qué es (this_week - last_week)['Queso blanco']?
4. Dos listas de precios son Series con los nombres de los productos, pero en distinto orden. ¿Por qué es peligroso new.to_numpy() - old.to_numpy()?

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