sábado, 17 de agosto de 2019

Python: Manipulación de Series y DataFrames

Vamos a ver cómo manipular Series y DataFrames:

Vamos a verlo con ejemplos de código:

## MANEJO Y MANIPULACIÓN DE SERIES Y DATAFRAMES ##

## Unión de dataframes ##

# Importamos la librería pandas:
import pandas as pd

# Creamos dos dataframes:
dataframe1 = pd.DataFrame({'c1':['1', '2', '3'], 'c2':['a', 'b', 'c']})
dataframe1 = pd.DataFrame({'c3':['1', '2', '3'], 'c2':['d', 'b', 'f']})

# Mergeamos los dos dataframes anteriores (hacemos un inner join por las columnas indicadas):
dataframe3 = pd.DataFrame.merge(dataframe1, dataframe2, on = 'c2')

# Mergeamos los dos dataframes anteriores con un left join:
dataframe4 = pd.DataFrame.merge(dataframe1, dataframe2, on = 'c2', how = 'left')

# Mergeamos los dos dataframes anteriores con un right join:
dataframe5 = pd.DataFrame.merge(dataframe1, dataframe2, on = 'c2', how = 'right')

# Mergeamos los dos dataframes anteriores con un outer join:
dataframe5 = pd.DataFrame.merge(dataframe1, dataframe2, on = 'c2', how = 'outer')

## Concatenación de series ##

# Creamos dos series:
serie1 = pd.Series([1, 2, 3], index = ['a', 'b', 'c'])
serie2 = pd.Series([4, 5, 6], index = ['d', 'e', 'f'])

# Las concatenamos:
pd.concat([serie1, serie2])

# Las concatenamos añadiendo una segunda clave que indica la procedencia de cada dato (se convierte en una serie de dos claves):
pd.concat([serie1, serie2], keys = ['serie1', 'serie2'])

## Concatenación de dataframes ##

# Creamos dos dataframes:
dataframe1 = pd.DataFrame(np.random.rand(3, 3), columns = ['a', 'b', 'c'])
dataframe2 = pd.DataFrame(np.random.rand(2, 3), columns = ['a', 'b', 'c'])

# Concatenamos los dataframes por las filas:
pd.concat([dataframe1, dataframe2])

# Concatenamos los dataframes por las filas, pero generamos de nuevo los índices para que np se repitan:
pd.concat([dataframe1, dataframe2], ignore_index = True)

## Combinar series y dataframes ##

# Creamos dos series:
serie1 = pd.Series([1, 2, np.nan])
serie1 = pd.Series([4, 5, 6])

# Combinamos las dos series (sustituye el valor nan de la primera serie por el valor 6 de la segunda):
serie3 = serie1.combine_first(serie2)

# Creamos dos dataframes:
dataframe1 = pd.DataFrame([1, 2, np.nan], columns = ['a'])
dataframe2 = pd.DataFrame([4, 5, 6], columns = ['a'])

# Combinamos los dos dataframes (sustituye el valor nan del primer dataframe por el valor 6 del segundo):
dataframe3 = dataframe1.combine_first(dataframe2)

## Eliminar duplicados en dataframes ##

# Creamos un dataframe con 4 filas y 2 columnas:
listaValores = [[1, 2], [1, 2], [5, 6], [5, 8]]
listaIndices = list('mnop')
listaColumnas = ['valor1', 'valor2']
dataframe = pd.DataFrame(listaValores, index = listaIndices, columns = listaColumnas)

# Eliminamos las filas completamente repetidas (todos sus valores iguales):
dataframe.drop_duplicates()

# Eliminamos las filas que tengan duplicado el valor de una columna concreta:
dataframe.drop_duplicates(['valor1'])

# Igual que el anterior, pero la fila que se conserva es la última que se encuentre repetida, en lugar de la primera:
dataframe.drop_duplicates(['valor1'], keep = 'last')

## Reemplazar datos en series ##

# Creamos una serie:
serie = pd.Series([1, 2, 3, 4, 5], index = list('abcde'))

# Sustituimos los valores 1 por valores 6:
serie.replace(1, 6)

# Sustituimos los valores 2 por 8 y 3 por 9 mediante un diccionario:
serie.replace({2:8, 3:9})

## Renombrar índices ##

# Creamos un dataframe:
listaValores = np.arange(9).reshape(3, 3)
listaIndices = list('abc')
listaColumnas = ['valor1', 'valor2', 'valor3']
dataframe = pd.DataFrame(listaValores, index = listaIndices, columns = listaColumnas)

# Sustituimos los nombres de los índices por su equivalente en mayúsculas:
nuevosIndices = dataframe.index.map(str.upper)
dataframe.index = nuevosIndices

# Volvemos a poner los índices en minúsculas:
dataframe = dataframe.rename(index = str.lower)

# Volvemos a modificar el valor de los índices, esta vez mediante un diccionario:
nuevosIndices = {'a':'f', 'b':'g', 'c':'h'}
dataframe.rename(index = nuevosIndices)

# Modificamos el valor de uno sólo de los indices (el inplace sólo sirve para que la modificación se realice sin tener que asignar el resultado de nuevo a la variable 'dataframe'):
nuevosIndices = {'f':'j'}
dataframe.rename(index = nuevosIndices, inplace = True)

## Agrupar datos en categorías ##

# Creamos una lista de rangos y otra de precios:
precios = [42, 55, 48, 23, 5, 21, 88, 34, 26]
rangos = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

# Creamos una lista con los rangos en los que se encuentra cada precio:
preciosConRango = pd.cut(precios, rangos)

# Contamos cuántos precios hay para cada categoría:
pd.value_counts(preciosConRango)

## Filtrar datos en dataframes ##

# Creamos un dataframe de 10 filas y 3 columnas:
listaValores = np.random.rand(10, 3)
listaColumnas = ['Campo1', 'Campo2', 'Campo3']
dataframe = pd.DataFrame(listaValores, columns = listaColumnas)

# Obtenemos los datos de la primera columna:
columna1 = dataframe['columna1']

# Obtenemos, de esa primera columna, las filas que tengan un valor concreto:
columna1[columna1 > 0.40]

# Obtenemos, del dataframe completo, las filas que cumplan un valor concreto en cualquiera de sus campos:
dataframe[dataframe > 0.40]

## Combinaciones de elementos ##

# Creamos un dataframe:
listaValores = np.arange(25).reshape(5, 5)
listaColumnas = ['Campo1', 'Campo2', 'Campo3', 'campo4', 'campo5']
dataframe = pd.DataFrame(listaValores, columns = listaColumnas)

# Creamos una lista de 5 números del 0 al 4 ordenados de forma aleatoria:
combinacionAleatoria = mp.random.permutation(5)

# Reordenamos las filas del dataframe siguiendo el mismo orden de la combinación aleatoria:
dataframe.take(combinacionAleatoria)

## Agrupación en dataframes ##

# Creamos un diccionario de listas con 4 claves-valor:
listaValores = {'clave1':['x', 'x', 'y', 'y', 'z'], 'clave2':['a', 'b', 'a', 'b', 'a'], 'datos1':np.random.rand(5), 'datos2':np.random.rand(5)}

# Creamos un dataframe con la lista de valores anterior (tendrá las 4 columnas y 5 filas):
dataframe = pd.DataFrame(listaValores)

# Agrupamos los datos de la columna "datos1" con reapecto a los valores de la columna "clave1", de tal forma que los valores "x" e "y" tendrán dos valores cada uno, y el "z" sólo uno:
grupo1 = dataframe['datos1'].groupby(dataframe['clave1'])

## Agregaciones en dataframes ##

# Creamos un dataframe:
listaValores = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [np.nan, np.nan, np.nan]]
listaColumnas = list('abc')
dataframe = pd.DataFrame(listaValores, columns = listaColumnas)

# Obtenemos la suma de todos los valores de las filas para cada columna, y el valor mínimo de entre todas las filas para cada columna (mostramos columnas):
dataframe.agg(['sum', 'min'])

# Hacemos la misma suma de antes, pero para las columnas, es decir, sumamos los valores de todas las columnas para cada fila (mostramos filas):
dataframe.agg("sum", axis = 1)

Y eso es todo.

No hay comentarios:

Publicar un comentario