jueves, 15 de agosto de 2019

Python: Librería pandas

La librería pandas nos permite la creación y manejo de series y dataframes.

Vamos a verlo con unos ejemplos:

## PANDAS - CREACIÓN Y MANEJO DE SERIES Y DATAFRAMES ##

## Series ##

# Importamos la librería:
import pandas as pd

# Creamos una serie de notas utilizando como índice las asignaturas:
asignaturas = ['matemáticas', 'física', 'historia', 'literatura']
notas = [8, 6, 7, 9]
serieNotas = pd.Series(notas, index = asignaturas)

# Mostramos las asignaturas cuyas notas son igual o mayor que 8:
serieNotas[serieNotas >= 8]

# Le ponemos un nombre a la serie:
serieNotas.name = 'Serie de notas'

# Le ponemos un nombre al índice de la serie:
serieNotas.index.name = 'Serie de notas'

# Convertimos una serie en un diccionario:
diccionario = serieNotas.to_dict()

# Convertimos un diccionario en una serie:
serie = pd.Series(diccionario)

# Utilizamos dos series y calculamos la media de sus valores:
asignaturas = ['matemáticas', 'física', 'historia', 'literatura']
notas1 = [8, 6, 7, 9]
serieNotas1 = pd.Series(notas1, index = asignaturas)
notas2 = [2, 3, 4, 5]
serieNotas2 = pd.Series(notas2, index = asignaturas)
serieNotasMedia = (serieNotas1 + serieNotas2) / 2

## Dataframes ##

# Importamos la librería webbrowser, que nos permitirá abrir una página web desde Python:
import webbrowser

# Abrimos una página web con datos para utilizar en un dataframe:
website = 'https://es.wikipedia.org/wiki/Anexo:Campeones_de_la_NBA'
webbrowser.open(website)

# Creamos un dataframe a partir de los datos que tengamos en el porta papeles (seleccionar y copiar):
dataframeNBA = pd.read_clipboard()

# Obtenemos los nombres de las columnas:
dataframeNBA.columns

# Mostramos los datos sólo de una columna en concreto:
dataframeNBA['Campeón del Oeste']

# Mostramos la fila número 5:
dataframeNBA.loc[5]

# Mostramos las 5 primeras filas:
dataframeNBA.head()

# Mostramos las 5 últimas filas:
dataframeNBA.tail()

# Creamos un dataframe a partir de un diccionario:
listaAsignaturas = ['Lenguaje', 'Matemáticas', 'Conocimiento']
listaNotas = [4, 5, 6]
diccionario = {'Asignaturas':listaAsignaturas, 'Notas':listaNotas}
dataframe = pd.DataFrame(diccionario)

## Índices ##

# Obtenemos los índices de una serie:
indices = ['a', 'b', 'c', 'd']
valores = [8, 6, 7, 9]
serie = pd.Series(valores, index = indices)
serie.index

# Obtenemos el primer índice:
serie.index[0]

# Creamos un dataframe a partir de listas y obtenemos los índices:
listaIndices = ['Lenguaje', 'Matemáticas', 'Conocimiento']
listaColumnas = ['Antonio', 'María', 'Pedro']
listaValores = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
dataframe = pd.DataFrame(listaValores, index = listaIndices, columns = listaColumnas)
dataframe.index

# Obtenemos el primer índice:
dataframe.index[0]

## Eliminar elementos ##

# Eliminamos un elemento concreto de una serie:
serie = pd.Series(np.arange(4), index = ['a', 'b', 'c', 'd'])
serie.drop('c')

# Eliminamos una fila y una columna concreta de un dataframe:
listaIndices = ['a', 'b', 'c']
listaColumnas = ['c1', 'c2', 'c3']
listaValores = np.arange(9).reshape(3, 3)
dataframe = pd.DataFrame(listaValores, index = listaIndices, columns = listaColumnas)
dataframe.drop('c2', axis = 1)

## Seleccionar datos en series ##

# Accedemos a un índice concreto de una serie:
indices = ['a', 'b', 'c', 'd']
valores = [8, 6, 7, 9]
serie = pd.Series(valores, index = indices)
serie['b']

# Seleccionamos los índices del 0 al 2:
serie[0:2]

# Seleccionamos un rango de índices específicos:
serie['a':'c']

# Seleccionamos los valores que sean mayor a 3:
serie[serie > 3]

# Seleccionamos los valores que sean mayor a 3 y los cambiamos por un 6:
serie[serie > 3] = 6

## Seleccionar datos en dataframes ##

# Seleccionamos una columna conctreta:
listaIndices = ['a', 'b', 'c']
listaColumnas = ['c1', 'c2', 'c3']
listaValores = np.arange(9).reshape(3, 3)
dataframe = pd.DataFrame(listaValores, index = listaIndices, columns = listaColumnas)
dataframe['c2']

# Seleccionamos un valor concreto especificando columna e índice:
dataframe['c2', 'a']

# Seleccionamos un valor concreto especificando índice y columna:
dataframe.loc['b']['c2']

# Seleccionamos dos columnas concretas:
dataframe[['c2', 'c3']]

# Seleccionamos las filas cuyo valor en la columna 2 sea mayor que 5:
dataframe[dataframe['c2'] > 5]

# Obtenemos el dataframe con trues para los valores mayores de 20 y false para los que no:
dataframe > 20

# Seleccionamos la fila completa de un índice concreto:
dataframe.loc['b']

## Operaciones ##

# Sumamos los valores de dos series:
indices = ['a', 'b', 'c', 'd']
valores1 = [8, 6, 7, 9]
valores2 = [8, 6, 7, 9]
serie1 = pd.Series(valores1, index = indices)
serie2 = pd.Series(valores2, index = indices)
serie1 + serie2

# Sumamos los valores de dos dataframes:
listaIndices = ['a', 'b', 'c']
listaColumnas = ['c1', 'c2', 'c3']
listaValores = np.arange(9).reshape(3, 3)
dataframe1 = pd.DataFrame(listaValores, index = listaIndices, columns = listaColumnas)
dataframe2 = pd.DataFrame(listaValores, index = listaIndices, columns = listaColumnas)
dataframe1 + dataframe2

# Sumamos los valores de dos dataframes, rellenando los valores nulos con ceros:
dataframe1.add(dataframe2, fill_value = 0)

## Ordenación y Clasificación en Series ##

# Ordenamos una serie por sus índices:
indices = ['C', 'B', 'A', 'D']
valores = [8, 6, 7, 9]
serie = pd.Series(valores, index = indices)
serie.sort_index()

# Ordenamos una serie por sus valores:
serie.sort_values()

# Asignamos a cada valor de la lista una posición en un ranking respecto al valor de las demás:
serie.rank()

## Estadísticas en dataframes ##

# Sumamos los valores de todas las filas (índices), obteniendo una sola fila con la suma de todos los valores:
listaIndices = ['1', '2', '2']
listaColumnas = ['c1', 'c2', 'c3']
listaValores = np.arange(9).reshape(3, 3)
dataframe = pd.DataFrame(listaValores, index = listaIndices, columns = listaColumnas)
dataframe.sum()

# Sumamos los valores de todas las columnas, obteniendo una sola columna con el mismo número de filas (índices):
dataframe.sum(axis = 1)

# Obtenemos el mínimo valor de cada columna:
dataframe.min()

# Obtenemos el máximo valor de cada columna:
dataframe.max()

# Obtenemos el máximo valor de cada fila:
dataframe.max(axis = 1)

# Obtenemos, para cada columna, el nombre del índice (fila) donde se encuentra el menor valor:
dataframe.idxmin()

# Obtenemos los estadísticos básicos del dataframe:
dataframe.describe()

## Valores nulos ##

# Creamos una serie de 4 valores con uno de ellos nulo:
listaValores = ['1', '2', np.nan, '4']
serie = pd.Series(listaValores, index = list('abcd'))

# Devolvemos verdadero o falso para cada valor dependiendo de si es nulo o no:
serie.isnull()

# Eliminamos de la serie los valores nulos:
serie = serie.dropna()

# Creamos un dataframe con algunos valores nulos:
listaValores = [[1, 2, 3], [4, np.nan, 5], [6, 7, np.nan]]
listaIndices = list('123')
listaColumnas = list('abc')
dataframe = pd.DataFrame(listaValores, index = listaIndices, columns = listaColumnas)

# Devolvemos verdadero o falso para cada valor dependiendo de si es nulo o no:
dataframe.isnull()

# Eliminamos todas las filas que contengan algún valor nulo:
dataframe = dataframe.dropna()

# Sustituimos todos los valores nulos por 0:
dataframe = dataframe.fillna(0)

## Jerarquía de Índices ##

# Creamos una serie con doble índice:
listaValores = np.random.rand(6)
listaIndices = [[1, 1, 1, 2, 2, 2], ['a', 'b', 'c', 'a', 'b', 'c']]
serie = pd.Series(listaValores, index = listaIndices)

# Seleccionamos de la serie el primer índice 1 (devuelve los 3 valores que tienen el índice 1):
serie[1]

# Seleccionamos un valor concreto a partir de ambos índices:
serie[1]['b']

# Creamos un dataframe a partir de una serie de doble índice (el primer índice será índice también, el segundo índice serán las columnas):
dataframe = serie.unstack()

# Creamos una serie de doble índice a partir de un dataframe:
serie = dataframe.stack()

Y eso es todo.

No hay comentarios:

Publicar un comentario