Pensamiento Computacional
Pandas
Introducción
Equipo docente
Universidad de San Andrés
Buenos Aires
Mayo 2022
Introducción
¿Qué es Pandas?
¿Qué es?
Una biblioteca de análisis y manipulación de datos para Python
Es un paquete de Python que proporciona estructuras de datos
rápidas, flexibles y expresivas diseñadas para que trabajar con
datos "relacionales" o "etiquetados" sea fácil e intuitivo. Su
objetivo es ser el bloque de construcción fundamental de alto
nivel para realizar análisis de datos prácticos (del mundo real)
en Python. Es un sistema de datos de código abierto.
1 43
Características de Pandas
DataFrame es la estructura de datos fundamental. Son
tablas de dos o más dimensiones, de tamaño variable que
permiten tener datos heterogéneos.
Mutabilidad de tamaño: las columnas se pueden insertar y
eliminar desde DataFrame y objetos de mayor dimensión.
Los datos se pueden alinear automáticamente o
manualmente usando un conjunto de etiquetas hechas para
este fin.
Permite agrupar los datos para realizar operaciones por
grupos o combinación en conjuntos de datos.
Facilita la conversión de estructuras de datos de Python y
NumPy a objetos del tipo DataFrame.
2 43
Características de Pandas
Manejo de datos basado en etiquetas, incluyendo la
indexación y la creación de subconjuntos.
Transformación y rotación de conjuntos de datos.
Herramientas robustas de E/S para cargar datos desde
archivos planos (CSV y delimitados), archivos de Excel, bases
de datos, etc.
Funcionalidad específica de series temporales: generación
de rango de fechas y conversión de frecuencia, estadísticas
de ventanas móviles, cambio de fecha y retraso.
3 43
Características de Pandas
Paquete Python: Python 3.
Instalación: pip install pandas
Cheatsheet: Enlace
Referencia: https://pandas.pydata.org/
4 43
Primeros pasos. En consola
In [1]: import pandas as pd
In [2]: pd.__version__
Out[3]: '1.4.2'
In [4]: pdoc pd
Class docstring:
pandas - a powerful data analysis
and manipulation library for Python
===================================
**pandas** is a Python package ...
5 43
DATAFRAMES
Contenedores de datos de Pandas:
I Lineal: Series. Es el único caso especial de una dimensión
(1D) de Dataframe.
I Multi Dimensión: DataFrame. Usamos DataFrame como para
casos más generales.
6 43
Dataframes
DATAFRAMES
Para mostrar las caracteríscas de los DataFrame , mostremos
un ejemplo, pero ¿desde donde podemos obtener los datos?
I Desde listas, diccionarioss, objetos numpy.
I Desde archivos CSV, HDF5, JSON, Excel, HTML, etc.
I Desde datos propios de Pandas.
I Desde el portapapeles.
I Etc. ;)
7 43
Ejemplo
In [5]: edades = [41, 56, 56, 57, 39, 59, 43, 56, 38, 60]
In [6]: pd.DataFrame(edades)
In [7]:
0
0 41
1 56
2 56
3 57
4 39
5 59
6 43
7 56
8 38
9 60
8 43
Ejemplo
In [8]: df_edades = pd.DataFrame(edades)
df_edades.head(3)
In [9]:
0
0 41
1 56
2 56
9 43
Ejemplo
In [10]: data = { "Nombre": ["Liu", "Rowland", "Rivers",
"Waters", "Rice", "Fields",
"Kerr", "Romero", "Davis", "Hall"],
"Edad": edades }
In [11]: print(data)
Out [12]:
{'Nombre': ['Liu', 'Rowland', 'Rivers', 'Waters', 'Rice', 'Fields',
'Kerr', 'Romero', 'Davis', 'Hall'], 'Edad': [41, 56, 56, 57, 39, 59,
43, 56, 38, 60]}
In [13]: df_ejemplo = pd.DataFrame(data)
df_ejemplo.head(4)
Nombre Edad
0 Liu 41
1 Rowland 56
2 Rivers 56
3 Waters 57
10 43
Dataframes
Automáticamente crea las columnas desde el diccionario.
Ahora se tienen dos columnas: una para los nombres, y otra
para las edades.
La primera columna es el índice.
DataFrame siempre tiene índices, ya sean auto-generados o
personalizados.
11 43
Operaciones
Operaciones, con df_ejemplo
In [14]: df_ejemplo.index
Out[15]: RangeIndex(start=0, stop=10, step=1)
Para hacer que el Nombre sea el índice se usa
.set_index()
inplace=True modificará el frame padre (algo extraño,
no?)
In [16]: df_ejemplo.set_index("Nombre", inplace=True)
df_ejemplo
12 43
Más operaciones
Edad
Nombre
Liu 41
Rowland 56
Rivers 56
Waters 57
Rice 39
Fields 59
Kerr 43
Romero 56
David 38
Hall 60
13 43
Más operaciones
In [14]: df_ejemplo.describe()
Out[15]:
Edad
count 10.000000
mean 50.500000
std 9.009255
min 38.000000
25% 41.500000
50% 56.000000
75% 56.750000
max 60.000000
14 43
Más operaciones
In [14]: df_ejemplo.T
Out[15]:
Nombre Liu Rowland Rivers Waters Rice Fields Kerr Romero Davis Hall
Edad 41 56 56 57 39 59 43 56 38 60
15 43
Operaciones aritméticas
In [14]: df_ejemplo.multiply(2).head(3)
Out[15]:
Edad
Nombre
Liu 82
Rowland 112
Rivers 112
In [14]: (df_ejemplo / 2).head(3)
Out[15]:
Edad
Nombre
Liu 20.5
Rowland 28.0
Rivers 28.0
16 43
Operaciones lógicas
In [14]: df_ejemplo > 40
Out[15]:
Edad
Nombre
Liu True
Rowland True
Rivers True
Waters True
Rice False
Fields True
Kerr True
Romero True
David False
Hall True
17 43
Otro ejemplo, más interesante
df_demo = pd.DataFrame({
"A": 1.2,
"B": pd.Timestamp('20220528'),
"C": [(-1)**i * np.sqrt(i) + np.e * (-1)**(i-1) for i in range(5)],
"D": pd.Categorical(["Esta", "columna", "tiene", "datos", "raros"]),
"E": "Igual"
})
df_demo
A B C D E
0 1.2 2022-05-28 -2.718282 Esta Igual
1 1.2 2022-05-28 1.718282 columna Igual
2 1.2 2022-05-28 -1.304068 tiene Igual
3 1.2 2022-05-28 0.986231 datos Igual
4 1.2 2022-05-28 -0.718282 raros Igual
18 43
Ordenamiento con el ejemplo df_demo
In [34]: df_demo.sort_values("C")
A B C D E
0 1.2 2022-05-28 -2.718282 Esta Igual
2 1.2 2022-05-28 -1.304068 tiene Igual
4 1.2 2022-05-28 -0.718282 raros Igual
3 1.2 2022-05-28 0.986231 datos Igual
1 1.2 2022-05-28 1.718282 columna Igual
19 43
Leyendo datos desde archivos
Leyendos datos externos
.read_json()
.read_csv()
.read_hdf5()
.read_excel()
Los anteriores son enlaces, al hacer click te llevan a la
documentación respectiva.
20 43
Leyendos datos externos. Ejemplo
{
"Personaje": ["Sawyer", "...", "Walt"],
"Actor": ["Josh Holloway", "...", "Malcolm David Kelley"],
"Principal": [true, "...", false]
}
In [38]: pd.read_json("datos.json").set_index("Personaje").sort_index()
Actor Principal
Personaje
Hurley Jorge Garcia True
Jack Matthew Fox True
Kate Evangeline Lilly True
Locke Terry OQuinn True
Sawyer Josh Holloway True
Walt Malcolm David Kelley False
21 43
Leyendos datos externos. Opciones para leer
CSV
Para ver toda la documentación: Enlace
Parámetros importantes:
sep: Configura el separador (por ejemplo para usar : en lugar de ,).
header: Especifica información sobre los headers de columnas, también
para múltiples índices de columnas.
names: Alternativa al header – provee la forma de dar títulos diferentes a
las columnas.
usecols: Descarta e incluye columnas, trabaja como cualquier lista (
range(0:20:2) ).
skiprows: Descarte filas.
na_values: Indica que cadenas o string(s) se reconocerán como valores N/A
(los cuales son ignorados en la operaciones del data frame).
parse_dates: Intenta analizar las fechas en CVS; dando diferentes
comportamientos en cuanto a su estructura de datos;
opcionalmente se utiliza junto con date_parser.
compression: Tratar el archivo de entrada como un archivo comprimido
("inferir", "gzip", "zip", ...).
decimal: Divisor de punto decimal.
22 43
Slicing
Slicing de Dataframes
Slicing: Permite seleccionar un sub-rango/sub-conjunto de
todo el dataframe.
Documentación: larga y detallada o corta
Slicing rápidos:
I Se usan operadores de corchetes para dividir el data frame
rápidamente: [].
I Se usa el nombre de la columna para seleccionarla y solo
mostrar sus datos.
I Se utiliza un valor numérico para seleccionar una fila.
23 43
Ejemplo: seleccione solo la columna C de
df_demo
In [41]: df_demo.head(3)
A B C D E
0 1.2 2022-05-28 -2.718282 Esta Igual
1 1.2 2022-05-28 1.718282 columna Igual
2 1.2 2022-05-28 -1.304068 tiene Igual
In [42]: df_demo['C'] # o df_demo.C también funciona.
C
0 -2.718282
1 1.718282
2 -1.304068
3 0.986231
4 -0.718282
24 43
Seleccionar más de una columna dando una lista
al operador []
Ejemplo: Seleccionar una lista con las columnas A y C , [’A’, ’C’]
desde df_demo
In [44]: my_slice = ['A', 'C']
In [45]: df_demo[my_slice]
Out [46]:
A C
0 1.2 -2.718282
1 1.2 1.718282
2 1.2 -1.304068
3 1.2 0.986231
4 1.2 -0.718282
25 43
Seleccionar más de una fila usando rangos
Se usan valores numéricos en corchetes [] para hacer slicing
sobre filas.
Se usan rangos como en las listas de Python.
In [45]: df_demo[1:3]
A B C D E
1 1.2 2022-05-28 1.718282 columna Igual
2 1.2 2022-05-28 -1.304068 tiene Igual
In [46]: df_demo[1:6:2]
A B C D E
1 1.2 2022-05-28 1.718282 columna Igual
3 1.2 2022-05-28 0.986231 datos Igual
26 43
Slicing lógico
Se pueden usar arreglos de booleanos.
In [54]: df_demo[df_demo["C"] > 0]
Out [54]:
A B C D E
1 1.2 2022-05-28 1.718282 columna Igual
3 1.2 2022-05-28 0.986231 datos Igual
In [55]: df_demo["C"] > 0
0 False
1 True
2 False
3 True
4 False
In [56]: df_demo[(df_demo["C"] < 0) and (df_demo["D"] == "raros")]
A B C D E
4 1.2 2022-05-28 -0.718282 raros Igual
27 43
Agregando datos a los
Dataframes
Agregando datos a Dataframes existentes
Para agregar nuevas columnas se usa
frame["nueva col"] = algo o .insert().
Para agregar nuevas filas se usa concat().
Para combinar data frames:
Concat: Combina varios data frames sobre una axisa.
Merge: Combina data frames sobre columnas comunes.
(Join) Adjuntar data frames.
Documentación Enlace
28 43
Agregar una columna a Dataframe
In [58]: df_demo["F"] = df_demo["C"] - df_demo["A"]
In [59]: df_demo.head(3)
A B C D E F
0 1.2 2022-05-28 -2.718282 Esta Igual -3.918282
1 1.2 2022-05-28 1.718282 columna Igual 0.518282
2 1.2 2022-05-28 -1.304068 tiene Igual -2.504068
29 43
Agregar una columna a un Dataframe
.insert() permite especificar la posición de la inserción.
.shape provee una tupla con el tamaño del data frame, (n°
filas, n° columnas).
In [59]: df_demo.insert(df_demo.shape[1] - 1, "E2", df_demo["C"] ** 2)
In [59]: df_demo.head(3)
A B C D E E2 F
0 1.2 2022-05-28 -2.718282 Esta Igual 7.389056 -3.918282
1 1.2 2022-05-28 1.718282 columna Igual 2.952492 0.518282
2 1.2 2022-05-28 -1.304068 tiene Igual 1.700594 -2.504068
30 43
Agregar una fila a un Dataframe
pd.concat(
[
df_demo,
pd.DataFrame({"A": 1.3, "B": pd.Timestamp("2018-02-27"), "C": -0.777,
"D": "los tiene?", "E": "Igual", "E2": NaN, "F": 23}, index=[0])
], ignore_index=True
)
A B C D E E2 F
0 1.2 2022-05-28 -2.718282 Esta Igual 7.389056 -3.918282
1 1.2 2022-05-28 1.718282 columna Igual 2.952492 0.518282
2 1.2 2022-05-28 -1.304068 tiene Igual 1.700594 -2.504068
3 1.2 2018-02-26 0.986231 datos Igual 0.972652 -0.213769
4 1.2 2018-02-26 -0.718282 raros Igual 0.515929 -1.918282
5 1.3 2018-02-27 -0.777000 los tiene? Igual NaN 23.000000
31 43
Concat y Merge en Dataframes
Primero, creamos dos data frames para poder mostrar cómo
funciona .concat() and .merge().
In [64]: df_1 = pd.DataFrame({"Clave": ["Primero", "Segundo"], "Valor": [1, 1]})
In [65]: df_1
Clave Valor
0 Primero 1
1 Segundo 1
In [66]: df_2 = pd.DataFrame({"Clave": ["Primero", "Segundo"], "Valor": [2, 2]})
In [67]: df_2
Clave Valor
0 Primero 2
1 Segundo 2
32 43
Concat y Merge en Dataframes
Concatenemos una lista de data frames verticalmente ( axisa=0 ).
In [66]: pd.concat([df_1, df_2])
Clave Valor
0 Primero 1
1 Segundo 1
0 Primero 2
1 Segundo 2
Lo mismo, pero reindexnado.
In [67]: pd.concat([df_1, df_2], ignore_index=True)
Clave Valor
0 Primero 1
1 Segundo 1
2 Primero 2
3 Segundo 2
33 43
Concat y Merge en Dataframes
Concatenar, pero horizontalmente.
In [68]: pd.concat([df_1, df_2], axis=1)
Clave Valor Clave Valor
0 Primero 1 Primero 2
1 Segundo 1 Segundo 2
Mezclar sobre una columna común.
In [69]: pd.merge(df_1, df_2, on="Clave")
Clave Valor_x Valor_y
0 Primero 1 2
1 Segundo 1 2
34 43
Graficando SIN Pandas
Matplotlib
Matplotlib: es el estándar de-facto para la graficación en
Python.
Interface principal: pyplot.
Es mejor utilizar una API orientada a objetos como Figure y
Axis.
https://matplotlib.org/
In [72]: import matplotlib.pyplot as plt
35 43
Matplotlib
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Usar algo así')
ax.set_xlabel("Números");
ax.set_ylabel("$\sqrt{x}$");
36 43
Matplotlib
Grafica múltiples líneas dentro de un mismo contenedor o
canvas.
Se hace llamando a ax.plot() varias veces.
y2 = y/np.exp(y*1.5)
fig, ax = plt.subplots()
ax.plot(x, y, label="y")
ax.plot(x, y2, label="y2")
ax.legend()
ax.set_title("Este gráfico no tiene sentido");
37 43
Matplotlib
Matplotlib puede también graficar datos de una DataFrame
data
Esto se debe a que sus datos son vistos como un arreglo.
fig, ax = plt.subplots()
ax.plot(df_demo.index, df_demo["C"], label="C")
ax.legend()
ax.set_title("No! no tiene sentido para nada");
38 43
Graficando CON Pandas
Graficando con Pandas
Cada frame tiene una función .plot() (ver la API )
Haces gráficos con Matplotlib.
Opciones importantes:
kind: ’line’ (por defecto), ’bar[h]’ , ’hist’ , ’box’ , ’kde’ ,
’scatter’ , ’hexbin’.
subplots: Fabrica una sub-plot por cada columna
(conviene usarlos con sharex y sharey).
figsize
grid: Agrega una grilla al gráfico (usa optiones de
Matplotlib).
style: Estilo de línea por columna (accepta listas o
diccionarios).
logx, logy, loglog: Gráficos Logarítmicos.
xticks, yticks: Usa valores para ticks (valores usados para
mostrar puntos específicos sobre las axisas).
39 43
Graficando con Pandas
Opciones importantes:
xlim, ylim: Límites de las axisas.
yerr, xerr: Agrega incertidumbre a los puntos de datos.
stacked: Apila un gráfico de barras
secondary_y: Usa una axisa y secundaria para el gráfico.
Labeling: title: Agrega un título al gráfico (Usa una
lista de cadenas o strings si
subplots=True )
legend: Agrega una leyenda.
table: Si se configura true, agrega una
tabla debajo del gráfico.
**kwds: Palabra clave pasada a los métodos Matplotlib.
40 43
Graficando con Pandas
Con slicing.
In [80]: df_demo["C"].plot(figsize=(10, 2));
Con selección o filtrado dentro del plot.
In [81]: df_demo.plot(y="C", figsize=(10, 2));
41 43
Graficando con Pandas
Usando el parámetro kind para modificar el tipo de gráfico.
Hay pseudo-subfunciones para cada tipo (kind) de gráfico.
In [81]: df_demo["C"].plot(kind="bar"); # o df_demo["C"].plot.bar();
42 43
Graficando con Pandas
In [82]: df_demo["C"].plot(kind="bar", legend=True, figsize=(12, 4),
ylim=(-1, 3), title="Esto es un gráfico de C");
43 / 43
¡Gracias! ¿Preguntas?