Bootcamps

Explora nuestra extensa colección de cursos diseñados para ayudarte a dominar varios temas y habilidades. Ya seas un principiante o un aprendiz avanzado, aquí hay algo para todos.

Academia

Aprende en vivo

Únete a nosotros en nuestros talleres gratuitos, webinars y otros eventos para aprender más sobre nuestros programas y comenzar tu camino para convertirte en desarrollador.

Próximos eventos en vivo

Catálogo de contenidos

Para los geeks autodidactas, este es nuestro extenso catálogo de contenido con todos los materiales y tutoriales que hemos desarrollado hasta el día de hoy.

Tiene sentido comenzar a aprender leyendo y viendo videos sobre los fundamentos y cómo funcionan las cosas.

Full-Stack Software Developer - 16w

Data Science and Machine Learning - 16 wks

Buscar en lecciones


IngresarEmpezar
← Regresar a lecciones

Weekly Coding Challenge

Todas las semanas escogemos un proyecto de la vida real para que construyas tu portafolio y te prepares para conseguir un trabajo. Todos nuestros proyectos están construidos con ChatGPT como co-pilot!

Únete al reto

Podcast: Code Sets You Free

Un podcast de cultura tecnológica donde aprenderás a luchar contra los enemigos que te bloquean en tu camino para convertirte en un profesional exitoso en tecnología.

Escuchar el podcast
Editar en Github
Abrir en Colab

Introduccion a Pandas

Pandas logo

Introducción a Pandas

Pandas es una librería de código abierto que proporciona estructuras de datos y está diseñado para manejar y analizar datos tabulares en Python. Pandas se basa en NumPy, lo que le permite integrarse bien en el ecosistema de la ciencia de los datos junto a otras librerías como Scikit-learn y Matplotlib.

En concreto, los puntos clave de esta librería son:

  • Estructuras de datos: Esta librería proporciona dos estructuras para trabajar con datos. Estos son las Series que son arrays unidimensionales etiquetados, similares a un vector, lista o secuencia y que es capaz de contener cualquier tipo de datos, y los DataFrames, que es una estructura bidimensional etiquetada con columnas que pueden ser de diferentes tipos, similar a una hoja de cálculo o a una tabla SQL.
  • Manipulación de datos: Pandas permite llevar a cabo un exhaustivo análisis de datos a través de funciones que pueden aplicarse directamente sobre sus estructuras de datos. Estas operaciones incluyen control de datos faltantes, filtrado de datos, fusión, combinación y unión de datos de diferentes fuentes...
  • Eficiencia: Todas las operaciones y/o funciones que se apliquen sobre las estructuras de datos son vectorizadas para mejorar el rendimiento en comparación con los bucles tradicionales e iteradores de Python.

Pandas es una herramienta fundamental para cualquier desarrollador que trabaje con datos en Python, ya que proporciona una amplia variedad de herramientas para la exploración, limpieza y transformación de datos, haciendo que el proceso de análisis sea más eficiente y efectivo.

Estructuras de datos

Pandas proporciona dos estructuras de datos principales: Series y DataFrames.

Series

Una serie en Pandas es una estructura de datos unidimensional etiquetada. Es similar a un array de 1D de NumPy, pero tiene un índice que permite el acceso a los valores por etiqueta. Una serie puede contener cualquier tipo de datos: enteros, cadenas, objetos de Python...

Ejemplo de Serie

Una serie en Pandas tiene dos partes diferenciadas:

  • Índice (index): Un array de etiquetas asociado a los datos.
  • Valor (value): Un array de datos.

Una serie puede ser creada utilizando la clase Series de la librería con una lista de elementos como argumento. Por ejemplo:

In [1]:
import pandas as pd

serie = pd.Series([1, 2, 3, 4, 5])
serie
Out[1]:
0    1
1    2
2    3
3    4
4    5
dtype: int64

Esto creará una serie con los elementos 1, 2, 3, 4 y 5. Además, al no haber incluido información sobre los índices, se genera uno automático empezando en 0. Si quisiéramos crear una nueva serie con un índice concreto se programaría como sigue:

In [2]:
serie = pd.Series([1, 2, 3, 4, 5], index = ["a", "b", "c", "d", "e"])
serie
Out[2]:
a    1
b    2
c    3
d    4
e    5
dtype: int64

De esta forma, la serie anterior tiene un índice compuesto por letras.

Ambas series almacenan los mismos valores, pero la forma en la que se accede puede variar según el índice.

En una serie se puede acceder a sus elementos por índice o por posición (esto último es lo que hacíamos en NumPy). A continuación se muestran algunas operaciones que se pueden realizar utilizando la serie anterior:

In [3]:
# Acceder al tercer elemento
print(serie["c"]) # Por índice
print(serie[2]) # Por posición

# Cambiar el valor del segundo elemento
serie["b"] = 7
print(serie)

# Sumar 10 a todos los elementos
serie += 10
print(serie)

# Calcular la suma de los elementos
sum_all = serie.sum()
print(sum_all)
3
3
a    1
b    7
c    3
d    4
e    5
dtype: int64
a    11
b    17
c    13
d    14
e    15
dtype: int64
70

DataFrame

Un DataFrame en Pandas es una estructura de datos bidimensional etiquetada. Es similar a un array de 2D de NumPy, pero tiene un índice que permite el acceso a los valores por etiqueta por fila y columna.

Ejemplo de DataFrame

Un DataFrame en Pandas tiene varias partes diferenciadas:

  • Datos (data): Una matriz de valores y que pueden ser de distinto tipo por columna.
  • Índice de fila (row index): Un array de etiquetas asociado a las filas.
  • Índice de columna (column index): Un array de etiquetas asociado a las columnas.

Un DataFrame puede verse como un conjunto de series unidas en una estructura tabular, con un índice por fila en común y un índice de columna propio de cada serie.

Series y DataFrame

Un DataFrame puede ser creado utilizando la clase DataFrame. Por ejemplo:

In [4]:
dataframe = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
dataframe
Out[4]:
012
0123
1456
2789

Esto creará un DataFrame con tres filas y tres columnas cada fila. Al igual que sucedía con las series, un DataFrame generará índices automáticos para filas y columnas si no se pasan como argumento en el constructor de la clase. Si quisiéramos crear un nuevo DataFrame con índices concretos para filas y columnas se programaría como sigue:

In [5]:
data = {
    "col A": [1, 2, 3],
    "col B": [4, 5, 6],
    "col C": [7, 8, 9]
}

dataframe = pd.DataFrame(data, index = ["a", "b", "c"])
dataframe
Out[5]:
col Acol Bcol C
a147
b258
c369

De esta forma se proporciona un índice personalizado para las columnas (etiquetando las filas dentro de un diccionario) y para las filas (con el argumento index tal y como sucedía con las series).

En un DataFrame se puede acceder a sus elementos por índice o por posición. A continuación se muestran algunas operaciones que se pueden realizar utilizando el DataFrame anterior:

In [6]:
# Acceder a todos los datos de una columna
print(dataframe["col A"]) # Por índice
print(dataframe.loc[:,"col A"]) # Por índice
print(dataframe.iloc[:,0]) # Por posición

# Acceder a todos los datos de una fila
print(dataframe.loc["a"]) # Por índice
print(dataframe.iloc[0]) # Por posición

# Acceder a un elemento (fila, columna) concreto
print(dataframe.loc["a", "col A"]) # Por índice
print(dataframe.iloc[0, 0]) # Por posición

# Crear una nueva columna
dataframe["col D"] = [10, 11, 12]
print(dataframe)

# Crear una nueva fila
dataframe.loc["d"] = [13, 14, 15, 16]
print(dataframe)

# Multiplicar por 10 los elementos de una columna
dataframe["col A"] *= 10
print(dataframe)

# Calcular la suma de todos los elementos
sum_all = dataframe.sum()
print(sum_all)
a    1
b    2
c    3
Name: col A, dtype: int64
a    1
b    2
c    3
Name: col A, dtype: int64
a    1
b    2
c    3
Name: col A, dtype: int64
col A    1
col B    4
col C    7
Name: a, dtype: int64
col A    1
col B    4
col C    7
Name: a, dtype: int64
1
1
   col A  col B  col C  col D
a      1      4      7     10
b      2      5      8     11
c      3      6      9     12
   col A  col B  col C  col D
a      1      4      7     10
b      2      5      8     11
c      3      6      9     12
d     13     14     15     16
   col A  col B  col C  col D
a     10      4      7     10
b     20      5      8     11
c     30      6      9     12
d    130     14     15     16
col A    190
col B     29
col C     39
col D     49
dtype: int64

Funciones

Pandas proporciona una gran cantidad de funciones predefinidas y que se pueden aplicar sobre las estructuras de datos vistas anteriormente. Algunas de las más utilizadas en el análisis de datos son:

In [7]:
import pandas as pd

s1 = pd.Series([1, 2, 3])
s2 = pd.Series([4, 5, 6])
d1 = pd.DataFrame([[1, 2, 3], [4, 5, 6]])
d2 = pd.DataFrame([[7, 8, 9], [10, 11, 12]])

# Operaciones Aritméticas
print("Suma de series:", s1.add(s2))
print("Suma de DataFrames:", d1.add(d2))

# Operaciones Estadísticas
# Se pueden aplicar de igual forma a los DataFrames
print("Media:", s1.mean())
print("Mediana:", s1.median())
print("Número de elementos:", s1.count())
print("Desviación estándar:", s1.std())
print("Varianza:", s1.var())
print("Máximo valor:", s1.max())
print("Mínimo valor:", s1.min())
print("Correlación:", s1.corr(s2))
print("Resumen estadístico:", s1.describe())
Suma de series: 0    5
1    7
2    9
dtype: int64
Suma de DataFrames:     0   1   2
0   8  10  12
1  14  16  18
Media: 2.0
Mediana: 2.0
Número de elementos: 3
Desviación estándar: 1.0
Varianza: 1.0
Máximo valor: 3
Mínimo valor: 1
Correlación: 1.0
Resumen estadístico: count    3.0
mean     2.0
std      1.0
min      1.0
25%      1.5
50%      2.0
75%      2.5
max      3.0
dtype: float64

Funciones personalizadas

Además de las funciones predefinidas de Pandas, también se pueden definir y aplicar otras a las estructuras de datos. Para ello, tenemos que programar la función para que reciba un valor (o una columna o fila en el caso de un DataFrame) y devuelva otro modificado, y referenciarla con apply.

Además, esta función permite utilizar expresiones lambda (lambda expressions) para la declaración anónima de funciones.

A continuación se muestra cómo aplicar funciones a las series:

In [8]:
import pandas as pd
s = pd.Series([1, 2, 3, 4])

# Definición explícita de la función
def squared(x):
    return x ** 2
s1 = s.apply(squared)
print(s1)

# Definición anónima de la función
s2 = s.apply(lambda x: x ** 2)
print(s2)
0     1
1     4
2     9
3    16
dtype: int64
0     1
1     4
2     9
3    16
dtype: int64

A continuación se muestra cómo aplicar funciones a un DataFrame, que puede hacerse por fila, por columna o por elementos, similar a las series:

In [9]:
df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [4, 5, 6]
})

# Aplicar función a lo largo de una columna
df["A"] = df["A"].apply(lambda x: x ** 2)
print(df)

# Aplicar función a lo largo de una fila
df.loc[0] = df.loc[0].apply(lambda x: x ** 2)
print(df)

# Aplicar función a todos los elementos
df = df.applymap(lambda x: x ** 2)
print(df)
   A  B
0  1  4
1  4  5
2  9  6
   A   B
0  1  16
1  4   5
2  9   6
    A    B
0   1  256
1  16   25
2  81   36

apply es más flexible que otras funciones vectorizadas de Pandas, pero puede ser más lenta, especialmente cuando se aplica a grandes conjuntos de datos. Siempre es importante explorar las funciones incorporadas de Pandas o NumPy primero, ya que suelen ser más eficientes que las que podríamos llegar a implementar nosotros.

Además, esta función puede devolver resultados de diferentes formas, dependiendo de la función aplicada y de cómo esté configurada.

Ejercicios

Haz clic en Abrir en Colab, para poder realizar los ejercicios

Solución: https://github.com/4GeeksAcademy/machine-learning-prework/blob/main/03-pandas/03.1-Intro-to-Pandas_solutions.ipynb

Creación de series y DataFrames

Ejercicio 01: Crea una serie a partir de una lista, de un array de NumPy y de un diccionario (★☆☆)

NOTA: Revisa la clase pd.Series (https://pandas.pydata.org/docs/reference/api/pandas.Series.html)

In [ ]:

Ejercicio 02: Crea un DataFrame a partir de un array de NumPy, de un diccionario y de una lista de tuplas (★☆☆)

NOTA: Revisa la clase pd.DataFrame (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html)

In [ ]:

Ejercicio 03: Crea 2 series y utilízalas para construir un DataFrame (★☆☆)

NOTA: Revisa las funciones pd.concat (https://pandas.pydata.org/docs/reference/api/pandas.concat.html) y pd.Series.to_frame (https://pandas.pydata.org/docs/reference/api/pandas.Series.to_frame.html)

In [ ]:

Filtrado y actualización

Ejercicio 04: Utiliza las series creadas en el ejercicio anterior y selecciona las posiciones de los elementos de la primera serie que están en la segunda (★★☆)

NOTA: Revisa la función pd.Series.isin (https://pandas.pydata.org/docs/reference/api/pandas.Series.isin.html)

In [ ]:

Ejercicio 05: Utiliza las series creadas en el ejercicio 03 y lista los elementos no comunes entre ambas (★★☆)

In [ ]:

Ejercicio 06: Crea un DataFrame de números aleatorios con 5 columnas y 10 filas y ordena una de sus columnas de menor a mayor (★★☆)

NOTA: Revisa la función pd.DataFrame.sort_values (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html)

In [ ]:

Ejercicio 07: Modifica el nombre de las 5 columnas del DataFrame anterior por el siguiente formato: N_column donde N es el número de la columna (★★☆)

NOTA: Revisa la función pd.DataFrame.sort_values (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html)

In [ ]:

Ejercicio 08: Modifica el índice de las filas del DataFrame del ejercicio 06 (★★☆)

NOTA: Revisa la función pd.DataFrame.sort_values (https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html)

In [ ]: