Módulo 1 – Introducción a pandas y DataFrames
Objetivos del módulo
Al finalizar este módulo serás capaz de:
- Entender qué es
pandasy para qué se utiliza - Diferenciar entre
SeriesyDataFrame - Crear DataFrames desde distintas estructuras de datos
- Cargar datos desde archivos CSV y EXCEL
¿Qué es pandas?
pandas es una librería de Python diseñada para el análisis y manipulación de datos estructurados.
Generalmente se trabaja con estas dos estructuras de datos:
- Series: datos unidimensionales. Similar a un array o lista.
- DataFrame: datos bidimensionales. Similar a una tabla de excel.
pandas es una herramienta muy intuitiva, fácil y potente imprescindible en el análisis y manipulación de datos.
Instalación e importación
Instalación
Con Python instalado en el ordenador hay varias formas de instalar pandas:
- Desde la Terminal:
pip install pandas
- Desde un .ipynb (python norebook)
!pip install pandas
Importación
Una vez instalado pandas, cada vez que queramos hacer uso de ésta librería en nuestro .py o .ipynb será necesario, antes que nada, importarlo.
import pandas as pd
pd es el alias comunmente usado para referirse a pandas. Ésto significa que cada vez que queramos usar una función de pandas, lo escribiremos en su forma corta pd.
Series vs DataFrame
Series
Una Series es una estructura unidimensional (similar a una lista). Para crear un objeto de tipo Series es necesario seguir esta sintaxis: pd.Series(lista), donde lista es cualquier lista que quieras que genere tu Series.
Por ejemplo:
s = pd.Series([10, 20, 30, 40])
s
Resultado:
0 10
1 20
2 30
3 40
dtype: int64
Se puede observar que un objeto de tipo Series contiene por defecto un índice creciente (0, 1, 2, ...) asignado a cada fila, junto con el valor. En el ejemplo anterior los índices son 0, 1, 2, 3y los valores son 10, 20, 30, 40. Al final indica el tipo (dtype para padas) de la Series. En este caso, int64 al estar formado por número enteros.
Además, podemos personalizar los índices de la siguiente manera:
s = pd.Series([10, 20, 30], index=["a", "b", "c"])
s
Resultado:
a 10
b 20
c 30
dtype: int64
Para poder recuperar los índices podemos hacerlo utilizando la función .index.
s.index
Resultado:
Index(['a', 'b', 'c'], dtype='object')
O, de una manera similar, los valores con .values.
s.values
Resultado:
array([10, 20, 30], dtype=int64)
Estas dos funciones index y values nos serán muy útiles en el futuro.
DataFrame
Un DataFrame es una estructura bidimensional, es decir, una tabla con filas y columnas.
| nombre | edad | ciudad |
|---|---|---|
| Maria | 25 | Valencia |
| Eric | 30 | Barcelona |
| Paula | 23 | Valencia |
Los dataframes son mucho más versátiles que los Series, ya que permiten capturar mucha más información de manera más organizada.
Vamos a ver 4 maneras de crear un dataframe.
Creación de DataFrames
Desde un diccionario
Los diccionarios en python están estructurados de manera muy similar a las tablas. De manera que podríamos entender las claves del diccionarios como los nombres de las columnas, y sus valores el contenido de la columna.
diccionario = {
"nombre": ["Maria", "Eric", "Paula"],
"edad": [25, 30, 23],
"ciudad": ["Valencia", "Barcelona", "Valencia"]
}
La sintaxtis es muy simple y siempre sigue la siguiente estructura: dataframe = pd.DataFrame(diccionario).
Para abreviar la palabra datafarme, es común utilizar el término df.
df = pd.DataFrame(diccionario)
df
Este código genera el siguiente dataframe:
| nombre | edad | ciudad |
|---|---|---|
| Maria | 25 | Valencia |
| Eric | 30 | Barcelona |
| Paula | 23 | Valencia |
Resumen:
- Cada clave del diccionario es una columna
- Cada valor es una lista que representa los valores de la columna
Te invito a intentar crear el siguiente dataframe:
| ciudad | Temperatura | Estado |
|---|---|---|
| Valencia | 25 | Nubes |
| Catellón | 22 | Soleado |
| Alicante | 23 | Soleado |
| Alzira | 29 | Nubes |
Desde una lista de diccionarios
También es habitual que la información nos venga ya en el siguiente formato: lista de diccionarios.
lista = [
{"nombre": "Maria", "edad": 25, "ciudad": "Valencia"},
{"nombre": "Eric", "edad": 30, "ciudad": "Barcelona"},
{"nombre": "Paula", "edad": 23, "ciudad": "Valencia"}
]
En este caso, encontramos una lista [ ] cuyos elementos son un diccionario equivalente a cada una de las filas de nuestro dataframe.
Sin embargo, el método de creación es el mismo:
df = pd.DataFrame(lista)
df
Dando como resultado la misma tabla que en el ejemplo anterior.
Este tipo es muy frecuente cuando los datos vienen de API o JSON.
Desde una lista de listas
Otra manera más poco habitual es una lista de listas, donde en ningún momento tenemos el nombre de las columnas.
datos = [
["Mria", 25, "Valencia"],
["Eric", 30, "Barcelona"],
["Paula", 23, "Valencia"]
]
Para que este método funcione es neceario que todas las sublistas de la lista tengan exactamente la misma información en el mismo orden.
La sintaxis para crear el dataframe con este método es: df = pd.DataFrame(datos, columns=listado_nombre_columnas). Donde en listado_nombre_columnas especificamos el nombre de las columnas.
df = pd.DataFrame(datos, columns=["nombre", "edad", "ciudad"])
Desde CSV o EXCEL
Generalmente el método más habitual es no tener acceso a los datos desde código, sino a través de un fichero .csv o .xlsx.
Por ejemplo, asumamos que un externo nos ha proporcionado un fichero csv como este: personas.txt
nombre,edad,ciudad
Maria,25,Valencia
Eric,30,Barcelona
Paula,23,Valencia
NOTA: los ficheros .csv son ficheros de texto separados por coma , o punto.coma ;, cuya primera fila indica los nombres de las columnas y el resto el contenido fila a fila.
Para cargar un archivo .csv debemos hacer uso de la función read_csv(), en cuyos paréntesis introducimos la ruta del fichero.
df = pd.read_csv("personas.csv")
Al igual que en los métodos vistos anteriormente, se nos generaría el dataframe siguiente:
| nombre | edad | ciudad |
|---|---|---|
| Maria | 25 | Valencia |
| Eric | 30 | Barcelona |
| Paula | 23 | Valencia |
La función read_csv() tiene variedad de posibles parámtros que se pueden consultar en https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
Los más destacados son sep= y encoding=.
sep: permite cambiar el separador del csv (,,;, etc.)encoding: permite cambiar la codificación del csv si vemos que algunos caracteres no se han leído bien o hay caracteres extraños. Opciones más comunes:utf-8ylatin1(para español).
df = pd.read_csv("personas.csv", sep=";", encoding="utf-8")
EXCEL: la función equivalente para datos provenientes de un archivo .xslx es read_excel(): https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html#pandas.read_excel.
Buenas prácticas
-
Usar nombres de columnas claros y en minúsculas.
-
Evitar espacios en nombres de columnas.
-
Revisar siempre los datos tras cargarlos.