← Regresar al Home

Contenido del curso

  • Unidad 1: Introducción a Pandas
  • Unidad 2: Lectura y escritura de datos
  • Unidad 3: Manipulación y limpieza de datos
  • Unidad 4: Transformaciones y operaciones
  • Unidad 5: Visualización básica
  • Unidad 6: Proyecto integrador

Unidad 1: Introducción a Pandas

Pandas es una biblioteca de Python especializada en la manipulación y análisis de datos estructurados. Su uso es esencial en ciencia de datos, machine learning y análisis exploratorio.

  • Instalación:
    pip install pandas
  • Objetos principales: Series y DataFrame

Ejemplo básico:


import pandas as pd
# Crear una Serie
s = pd.Series([1, 2, 3])
print(s)

# Crear un DataFrame
df = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
print(df)
        

Función usada:

pd.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)

Una Series es una estructura unidimensional (como un vector) con etiquetas (índice). Es similar a un arreglo de NumPy pero con más funcionalidad.

Parámetros:

Parámetro Tipo Descripción
data array-like, iterable, dict, scalar Los datos de la serie. Puede ser una lista, un diccionario, un arreglo de NumPy, un escalar, etc.
index array-like o Index (opcional) Etiquetas del índice. Si no se proporciona, se usará un índice numérico por defecto.
dtype str o tipo NumPy (opcional) Tipo de dato de los valores. Si se omite, se infiere automáticamente.
name str (opcional) Nombre asignado a la serie.
copy bool, por defecto False Si es True, los datos se copian incluso si no es necesario.
fastpath bool, por defecto False Reservado para uso interno de pandas (no se recomienda usar directamente).

Función usada:

pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

Un DataFrame es una estructura de datos bidimensional etiquetada (como una tabla), con columnas de potencialmente diferentes tipos (números, cadenas, booleanos, etc.).

Parámetros:

Parámetro Tipo Descripción
data ndarray, dict, Series, iterable o DataFrame Los datos a convertir en un DataFrame. Puede ser un diccionario de listas, un arreglo NumPy, una lista de listas, otro DataFrame, etc.
index array-like, opcional Etiquetas para las filas. Si se omite, se genera un rango numérico.
columns array-like, opcional Etiquetas para las columnas. Si se omite, se infieren del objeto data.
dtype dtype, opcional Tipo de dato por defecto para las columnas.
copy bool, por defecto False Si es True, copia los datos incluso si no es necesario.

Unidad 2: Lectura y escritura de datos

En el análisis de datos, una de las primeras tareas fundamentales es importar y exportar información entre diferentes formatos. La biblioteca pandas ofrece herramientas potentes y flexibles para leer archivos como CSV, Excel y JSON, así como para guardar nuestros resultados en estos mismos formatos con facilidad.

En esta unidad aprenderás a:

  • Cargar datasets desde archivos comunes como .csv y .xlsx.
  • Examinar rápidamente su contenido con métodos como head(), info() y describe().
  • Exportar resultados a archivos para compartirlos o almacenarlos.
  • Controlar aspectos importantes como codificaciones, separadores, columnas específicas y formatos de salida.

Dominar estas operaciones es esencial para trabajar de manera fluida con fuentes de datos reales, automatizar reportes y preparar la información para análisis más avanzados.

En este ejemplo se muestra cómo utilizar pandas.read_csv() para cargar un archivo .csv y cómo exportar los datos resultantes a un archivo de Excel usando DataFrame.to_excel(). Estas funciones permiten importar y guardar información de forma sencilla y eficiente.


import pandas as pd
# Cargar un CSV
df = pd.read_csv("datos.csv")
print(df.head())

# Guardar a Excel
df.to_excel("salida.xlsx", index=False)
        

Función pd.read_csv:

pd.read_csv(filepath_or_buffer, sep=',', header='infer', names=None, index_col=None, usecols=None, dtype=None, na_values=None, skiprows=None, nrows=None, encoding=None, parse_dates=False)
            
La función read_csv permite leer archivos de texto delimitados por comas (CSV) y cargarlos como un DataFrame. Devuelve un objeto pandas.DataFrame que contiene los datos del archivo CSV listos para su análisis.

Parámetros:

Parámetro Tipo Descripción
filepath_or_buffer str, path object o file-like Ruta al archivo o buffer desde el cual leer los datos.
sep str, por defecto ',' Separador entre columnas. Puede ser ',', '\t', ';', etc.
header int, list of int o 'infer' Fila(s) a usar como nombres de columnas. Por defecto 'infer' usa la primera fila.
names list, opcional Lista de nombres de columnas. Útil si header=None.
index_col int, str o list, opcional Columna o combinación de columnas que se usarán como índice del DataFrame.
usecols list, opcional Lista de columnas a cargar desde el archivo.
dtype dict, opcional Forzar tipos de datos por columna.
na_values scalar, str, list o dict Valores que deben interpretarse como NaN.
skiprows int o list, opcional Número de filas (o índices) a omitir al inicio del archivo.
nrows int, opcional Número de filas a leer.
encoding str, opcional Codificación del archivo. Ej: 'utf-8', 'latin1'.
parse_dates bool o list, opcional Indica si se deben interpretar automáticamente columnas como fechas.

Función df.head:

df.head(n=5)
El método head() devuelve las primeras filas de un DataFrame. Es ideal para explorar rápidamente el contenido y estructura de los datos cargados.

Parámetros:

Parámetro Tipo Valor por defecto Descripción
n int 5 Número de filas a retornar desde el inicio del DataFrame. Si se proporciona un número negativo, se excluyen las últimas n filas del resultado.

Función df.to_excel:

df.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None, storage_options=None)
            
Este método guarda un DataFrame en un archivo Excel, usando openpyxl para .xlsx o xlwt para .xls.

Parámetros:

Parámetro Tipo Valor por defecto Descripción
excel_writer str o buffer — Ruta del archivo o un objeto ExcelWriter.
sheet_name str 'Sheet1' Nombre de la hoja en el archivo Excel.
na_rep str '' Texto para representar valores NaN.
float_format str, opcional None Formato de salida para números flotantes (ej. '%.2f').
columns list, opcional None Lista de columnas a exportar.
header bool o list True Indica si se escribe el encabezado del DataFrame.
index bool True Indica si se escribe la columna de índice.
index_label str o lista None Nombre(s) para la(s) columna(s) de índice.
startrow int 0 Fila donde comienza la escritura de datos.
startcol int 0 Columna donde comienza la escritura de datos.
engine str None Motor a usar: 'openpyxl', 'xlsxwriter', etc.
merge_cells bool True Indica si se fusionan celdas para etiquetas jerárquicas.
encoding str None Sólo para archivos .xls. Codificación del archivo.
freeze_panes tuple None Par (fila, columna) para congelar paneles.
storage_options dict, opcional None Parámetros adicionales para sistemas de almacenamiento remotos compatibles con fsspec, como Amazon S3, Azure, etc.

Unidad 3: Manipulación y limpieza de datos

En la práctica real, los datos rara vez vienen perfectamente organizados. Es común encontrarse con archivos incompletos, columnas mal nombradas, datos duplicados o tipos de datos inconsistentes. Antes de cualquier análisis significativo, es imprescindible limpiar y estructurar correctamente la información. En esta unidad aprenderás a:

  • Seleccionar columnas y filas con diversas técnicas de indexado.
  • Renombrar, crear o eliminar columnas.
  • Identificar y tratar valores nulos (NaN).
  • Convertir tipos de datos para facilitar el análisis.
  • Estandarizar y preparar tus datos para modelos o visualizaciones posteriores.
Estas habilidades forman la base para asegurar que tu análisis se base en información confiable, limpia y bien estructurada. Este fragmento de código demuestra cómo cargar un archivo csv y aplicar tareas comunes de limpieza de datos, como eliminar filas con valores nulos mediante dropna() y renombrar columnas con rename(). Estas operaciones son esenciales para preparar un conjunto de datos antes del análisis.


import pandas as pd
df = pd.read_csv("datos.csv")
# Eliminar filas con valores nulos
df = df.dropna()
# Renombrar columnas
df = df.rename(columns={"Nombre": "nombre_completo"})
            

Función df.dropna:

df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
El método dropna() permite eliminar filas o columnas que contengan valores nulos (NaN, None o NaT). Es muy útil para limpiar datos incompletos antes del análisis. Devuelve un nuevo DataFrame sin las filas/columnas eliminadas, a menos que se use inplace=True.

Parámetro Tipo Valor por defecto Descripción
axis {0 o 'index', 1 o 'columns'} 0 Determina si se eliminan filas (axis=0) o columnas (axis=1) con valores nulos.
how {'any', 'all'} 'any' Indica si se elimina la fila o columna si tiene cualquier valor nulo ('any') o todos los valores nulos ('all').
thresh int, opcional None Requiere un número mínimo de valores no nulos para mantener la fila o columna.
subset list, opcional None Lista de columnas a considerar al buscar valores nulos.
inplace bool False Si es True, modifica el DataFrame en lugar de devolver una copia.

Función df.rename:

df.rename(mapper=None, *, index=None, columns=None, axis=None, inplace=False, level=None, errors='ignore')
El método rename() permite renombrar etiquetas de columnas o filas (índice) de un DataFrame. Es una herramienta clave para mantener los datos organizados, con nombres consistentes y legibles. Puedes renombrar usando un diccionario (dict), funciones (str.upper, lambda, etc.) o mapeos parciales. No modifica el DataFrame original a menos que se use inplace=True.
  1. Si inplace=False (por defecto): retorna una nueva copia del DataFrame con los cambios aplicados.
  2. Si inplace=True: retorna None y modifica el DataFrame original.

Parámetro Tipo Valor por defecto Descripción
mapper dict o función None Función o diccionario para renombrar etiquetas en el eje especificado por axis.
index dict o función, opcional None Mapeo específico para renombrar etiquetas del índice (filas).
columns dict o función, opcional None Mapeo específico para renombrar etiquetas de columnas.
axis {0/'index', 1/'columns'} None Eje sobre el cual aplicar el mapper. Alternativa a index o columns.
inplace bool False Si es True, modifica el DataFrame original en lugar de devolver uno nuevo.
level int o str, opcional None Si el eje tiene múltiples niveles (MultiIndex), permite especificar uno para aplicar los cambios.
errors {'ignore', 'raise'} 'ignore' Define el comportamiento si alguna etiqueta no se encuentra. 'raise' lanza error; 'ignore' la omite.

Unidad 4: Transformaciones y operaciones

Métodos de transformación general

Los métodos de transformación general en Pandas permiten modificar, convertir o enriquecer los datos sin alterar la estructura del DataFrame o Series. Estas transformaciones se aplican elemento por elemento o columna por columna y son ideales para limpiar, formatear y preparar los datos antes del análisis. Funciones como apply(), astype(), replace() o fillna() son fundamentales para asegurar que los datos estén en el formato adecuado para el análisis posterior.

Método Descripción Ejemplo
apply(func)Aplica una función a lo largo de un eje.df.apply(np.log)
map(func)Aplica una función a cada elemento de una Serie.df['col'].map(str.upper)
replace()Reemplaza valores específicos por otros.df.replace({0: np.nan})
astype()Cambia el tipo de datos de una columna.df['col'].astype(int)
round()Redondea los valores numéricos.df.round(2)
clip()Restringe valores dentro de un rango.df.clip(lower=0, upper=100)
fillna()Rellena valores nulos.df.fillna(0)
ffill() / bfill()Propaga valores hacia adelante o hacia atrás.df.ffill()
abs()Valor absoluto.df.abs()
rank()Asigna rangos a los valores.df.rank()
diff()Diferencia entre elementos consecutivos.df.diff()
pct_change()Cambio porcentual entre elementos consecutivos.df.pct_change()
cumsum() / cumprod()Suma y producto acumulado.df.cumsum()
where() / mask()Transforma valores según una condición.df.where(df > 0)

apply(func, axis=0, raw=False, result_type=None, args=(), **kwds)

Descripción: El método apply() permite aplicar una función a lo largo de un eje del DataFrame (por fila o por columna). Es útil cuando se quiere ejecutar una operación personalizada sobre cada columna o fila de forma eficiente y vectorizada.

Resultado: Devuelve un objeto (Serie o DataFrame) dependiendo de la función aplicada. El tamaño puede cambiar si la función produce múltiples valores o columnas nuevas.

Parámetros

Parámetro Tipo Valor por defecto Descripción
func función — Función que se aplicará a lo largo del eje. Puede ser una función de Python, NumPy o una función lambda.
axis int o str 0 El eje sobre el cual aplicar la función: 0 o 'index' para columnas, 1 o 'columns' para filas.
raw bool False Si es True, pasa un array de NumPy sin etiquetas en lugar de una Serie.
result_type str o None None Define el formato de salida cuando se usa axis=1: puede ser 'expand', 'reduce' o 'broadcast'.
args tuple () Argumentos posicionales adicionales que se pasan a la función.
**kwds dict — Otros argumentos nombrados que se pasan a la función.

map(arg, na_action=None)

Descripción: El método map() se aplica exclusivamente a Series y permite transformar cada elemento de la Serie utilizando una función, un diccionario o una Serie de mapeo. Es útil para reemplazar valores, aplicar conversiones o formatear datos de forma personalizada.

Resultado: Devuelve una nueva Serie con los valores transformados. La longitud y el índice permanecen iguales al original.

Parámetros

Parámetro Tipo Valor por defecto Descripción
arg función, dict o Series — Objeto que define cómo se transforman los valores: puede ser una función (lambda, str.upper), un diccionario o una Serie.
na_action str None Si es 'ignore', no aplica la función a valores NaN; si es None, se procesan normalmente.

replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method=None)

Descripción: El método replace() permite sustituir valores en una Serie o DataFrame por otros. Puede utilizarse con valores individuales, listas, diccionarios, expresiones regulares o funciones, lo que lo convierte en una herramienta versátil para la limpieza de datos.

Resultado: Devuelve una Serie o DataFrame con los valores reemplazados, a menos que se use inplace=True.

Parámetros

Parámetro Tipo Valor por defecto Descripción
to_replace str, num, list, dict, Series, regex None Valor o patrón a reemplazar. Puede ser un valor, lista, diccionario o expresión regular.
value scalar, str, list, dict, Series None Valor o valores por los que se reemplaza to_replace.
inplace bool False Si es True, modifica el objeto original.
limit int None Número máximo de reemplazos por columna.
regex bool o str False Indica si to_replace es una expresión regular o si debe interpretarse como tal.
method {'pad', 'ffill', 'bfill', None} None Método de relleno para valores NaN cuando to_replace es NaN o equivalente.

astype(dtype, copy=True, errors='raise')

Descripción: El método astype() permite convertir el tipo de datos de una Serie o columna de un DataFrame a un tipo específico (por ejemplo, int, float, str). Es especialmente útil cuando se necesita asegurar un tipo de dato antes de aplicar cálculos o exportar datos.

Resultado: Devuelve una nueva Serie o DataFrame con el tipo de dato convertido. Si copy=False, puede modificar la referencia original.

Parámetros

Parámetro Tipo Valor por defecto Descripción
dtype str, tipo o dict — Tipo al que se desea convertir (ej: 'int', 'float32', {'col': 'str'}).
copy bool True Si True, se devuelve una copia del objeto. Si False, se intenta hacer la conversión en el mismo objeto.
errors {'raise', 'ignore'} 'raise' Si 'raise', lanza error en caso de conversión inválida. Si 'ignore', deja los datos originales sin cambios.

round(decimals=0)

Descripción: El método round() permite redondear los valores numéricos de una Serie o DataFrame a una cantidad específica de decimales. Es útil para preparar datos para visualización, exportación o simplemente para mejorar la legibilidad.

Resultado: Devuelve un nuevo objeto con los valores redondeados a la cantidad de decimales especificada. Si se usa en DataFrame, afecta a todas las columnas numéricas.

Parámetros

Parámetro Tipo Valor por defecto Descripción
decimals int o dict 0 Número de decimales a los que se deben redondear los valores. Puede ser un número o un diccionario por columna.

clip(lower=None, upper=None, axis=None, inplace=False)

Descripción: El método clip() limita los valores de una Serie o DataFrame a un rango definido por lower (mínimo) y/o upper (máximo). Todos los valores por debajo del límite inferior se reemplazan por lower, y los que están por encima, por upper.

Resultado: Devuelve un nuevo objeto con los valores ajustados dentro del rango especificado, a menos que se use inplace=True.

Parámetros

Parámetro Tipo Valor por defecto Descripción
lower float, int, o dict None Valor mínimo permitido. Todos los valores menores se reemplazan por este.
upper float, int, o dict None Valor máximo permitido. Todos los valores mayores se reemplazan por este.
axis int o str None Eje sobre el cual aplicar la operación (si se usa un dict por columnas o filas).
inplace bool False Si es True, modifica el objeto original.

fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

Descripción: El método fillna() permite reemplazar los valores nulos (NaN) en una Serie o DataFrame con un valor fijo, el valor de otra columna, o con un método de propagación como ffill o bfill. Es una herramienta esencial para la limpieza de datos faltantes.

Resultado: Devuelve un nuevo objeto con los valores nulos reemplazados, a menos que se utilice inplace=True.

Parámetros

Parámetro Tipo Valor por defecto Descripción
value scalar, dict, Series o DataFrame None Valor con el cual reemplazar los NaN. Puede ser un valor único o por columna.
method {'backfill', 'bfill', 'pad', 'ffill', None} None Método de propagación para rellenar los nulos. No se puede usar junto con value.
axis {0 o 'index', 1 o 'columns'} None El eje en el cual aplicar el método.
inplace bool False Si es True, modifica el objeto original.
limit int None Número máximo de valores consecutivos a rellenar.
downcast dict o str None Intento de convertir el tipo de los datos a un tipo más pequeño (por ejemplo, float64 a float32).

ffill(axis=None, inplace=False, limit=None, downcast=None)

Descripción: El método ffill() (forward fill) propaga el último valor válido hacia adelante para reemplazar valores nulos en una Serie o DataFrame. Es útil para rellenar valores faltantes en series temporales o datos secuenciales.

Resultado: Devuelve un objeto con los NaN reemplazados hacia adelante, o modifica el objeto original si se usa inplace=True.

Parámetros

Parámetro Tipo Valor por defecto Descripción
axis{0 o 'index', 1 o 'columns'}NoneEl eje a lo largo del cual rellenar los valores.
inplaceboolFalseSi es True, modifica el objeto original.
limitintNoneMáximo número de valores consecutivos a rellenar.
downcastdict o strNoneIntento de convertir a un tipo más eficiente después del relleno.

bfill(axis=None, inplace=False, limit=None, downcast=None)

Descripción: El método bfill() (backward fill) rellena valores nulos con el siguiente valor válido. Se usa principalmente para completar datos ausentes en secuencias o columnas.

Resultado: Devuelve un objeto con los NaN rellenados hacia atrás, o modifica el original si se usa inplace=True.

Parámetros

Parámetro Tipo Valor por defecto Descripción
axis{0 o 'index', 1 o 'columns'}NoneEl eje sobre el cual aplicar el relleno.
inplaceboolFalseSi True, modifica el objeto original.
limitintNoneMáximo de valores consecutivos a rellenar.
downcastdict o strNoneIntento de convertir tipos para reducir memoria.

abs()

Descripción: El método abs() devuelve el valor absoluto de cada elemento en una Serie o DataFrame numérico. Es útil para eliminar signos negativos y trabajar con distancias, diferencias u otras medidas.

Resultado: Devuelve un nuevo objeto del mismo tipo con los valores transformados a su valor absoluto.

Parámetros

Este método no acepta parámetros

rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)

Descripción: El método rank() asigna un rango (posición ordinal) a cada valor, con reglas definidas para empates. Es muy útil en rankings, evaluaciones y estadísticas descriptivas.

Resultado: Devuelve una Serie o DataFrame con valores decimales que representan la posición relativa de cada dato dentro de su grupo.

Parámetros

Parámetro Tipo Valor por defecto Descripción
axis{0 o 'index', 1 o 'columns'}0El eje sobre el cual calcular los rangos.
methodstr'average'Método de asignación de empates: 'average', 'min', 'max', 'first' o 'dense'.
numeric_onlybool o NoneNoneSi se usa en DataFrame, limita el cálculo a columnas numéricas.
na_optionstr'keep'Controla cómo se manejan los NaN: 'keep', 'top' o 'bottom'.
ascendingboolTrueDetermina si el ranking es en orden ascendente (True) o descendente (False).
pctboolFalseSi True, el ranking se expresa como porcentaje (de 0 a 1).

diff(periods=1, axis=0)

Descripción: El método diff() calcula la diferencia entre el valor actual y el valor desplazado según el número de periodos especificado. Es útil para identificar cambios o variaciones en series temporales o secuencias numéricas.

Resultado: Devuelve una Serie o DataFrame del mismo tamaño, con la diferencia entre valores consecutivos o según el desplazamiento indicado.

Parámetros

ParámetroTipoValor por defectoDescripción
periodsint1Número de periodos hacia atrás para calcular la diferencia.
axis{0 o 'index', 1 o 'columns'}0El eje a lo largo del cual calcular la diferencia.

pct_change(periods=1, fill_method='pad', limit=None, freq=None, axis=0)

Descripción: El método pct_change() calcula el cambio porcentual entre elementos consecutivos. Es comúnmente usado en análisis financiero o de crecimiento temporal.

Resultado: Devuelve un objeto del mismo tamaño con los valores expresados como proporciones del cambio relativo.

Parámetros

ParámetroTipoValor por defectoDescripción
periodsint1Número de periodos para calcular el cambio porcentual.
fill_methodstr o None'pad'Método para llenar valores nulos antes del cálculo.
limitint o NoneNoneLímite máximo de valores a llenar consecutivamente.
freqstr o DateOffsetNoneSolo para series temporales. Desplazamiento basado en fecha.
axis{0, 1, 'index', 'columns'}0El eje sobre el cual aplicar el cálculo.

cumsum(axis=None, skipna=True)

Descripción: El método cumsum() calcula la suma acumulada de los valores en una Serie o DataFrame a lo largo de un eje. Es útil para análisis de tendencias acumulativas.

Resultado: Devuelve un objeto con la suma acumulativa por fila o columna.

Parámetros

ParámetroTipoValor por defectoDescripción
axis{0 o 'index', 1 o 'columns'}NoneEl eje a lo largo del cual se acumula.
skipnaboolTrueIgnora los valores nulos en el cálculo.

cumprod(axis=None, skipna=True)

Descripción: El método cumprod() calcula el producto acumulado de los valores en una Serie o DataFrame. Es útil para modelos de crecimiento compuesto o acumulación proporcional.

Resultado: Devuelve un objeto con los productos acumulados por fila o columna.

Parámetros

ParámetroTipoValor por defectoDescripción
axis{0 o 'index', 1 o 'columns'}NoneEl eje a lo largo del cual calcular el producto.
skipnaboolTrueIgnora los NaN en el cálculo.

where(cond, other=nan, inplace=False, axis=None, level=None, errors='raise')

Descripción: El método where() devuelve los valores originales donde la condición es verdadera, y un valor alternativo donde la condición es falsa. Es útil para aplicar filtros o condiciones condicionales sin alterar la estructura del DataFrame.

Resultado: Devuelve un objeto con los valores originales o alternativos según la condición.

Parámetros

ParámetroTipoValor por defectoDescripción
condbool array—Condición booleana que determina qué valores conservar.
otherscalar, Series o DataFrameNaNValor alternativo a asignar donde la condición es falsa.
inplaceboolFalseSi es True, modifica el objeto original.
axisint o strNoneEje sobre el cual aplicar la condición.
levelint o strNoneEn índices jerárquicos, especifica el nivel a comparar.
errorsstr'raise'Controla los errores de alineación: 'raise' o 'ignore'.

mask(cond, other=nan, inplace=False, axis=None, level=None, errors='raise')

Descripción: El método mask() es el complemento de where(): reemplaza los valores donde la condición es verdadera con un valor alternativo. Es útil cuando se desea ocultar o filtrar ciertos valores según una condición.

Resultado: Devuelve un objeto donde los valores originales han sido reemplazados donde la condición es verdadera.

Parámetros

ParámetroTipoValor por defectoDescripción
condbool array—Condición booleana donde se aplicará el reemplazo.
otherscalar, Series o DataFrameNaNValor alternativo a colocar donde se cumpla la condición.
inplaceboolFalseSi True, modifica el objeto original.
axisint o strNoneEje sobre el cual aplicar la condición.
levelint o strNoneEn MultiIndex, permite seleccionar un nivel para aplicar la máscara.
errorsstr'raise'Controla errores de alineación: 'raise' o 'ignore'.

El siguiente código es un ejemplo de como se puede utilizar cada uno de los métodos


import pandas as pd
import numpy as np

# Crear DataFrame de ejemplo
df = pd.DataFrame({
    "nombre": ["ana", "luis", "maria", "luis", None],
    "edad": [25, 30, None, 22, 40],
    "ingresos": [1000, 1500, 1200, np.nan, 2000],
    "activo": [1, 0, 1, 1, 0]
})

print("DataFrame original:")
print(df)

# apply() - aplicar función a columnas
df["ingresos_log"] = df["ingresos"].apply(np.log)

# map() - transformar una Serie
df["nombre_mayus"] = df["nombre"].map(str.upper if pd.notnull else None)

# replace() - cambiar valores específicos
df["activo_binario"] = df["activo"].replace({0: "No", 1: "Sí"})

# astype() - cambiar tipo de dato
df["edad_entera"] = df["edad"].fillna(0).astype(int)

# round() - redondear ingresos
df["ingresos_redondeados"] = df["ingresos"].round(0)

# clip() - limitar valores
df["ingresos_clipped"] = df["ingresos"].clip(lower=1100, upper=1800)

# fillna() - rellenar nulos
df["edad_sin_na"] = df["edad"].fillna(df["edad"].mean())

# ffill() y bfill()
df["ingresos_ffill"] = df["ingresos"].ffill()
df["ingresos_bfill"] = df["ingresos"].bfill()

# abs()
df["desviacion"] = (df["edad"] - df["edad"].mean()).abs()

# rank()
df["rank_ingresos"] = df["ingresos"].rank()

# diff()
df["dif_edad"] = df["edad"].diff()

# pct_change()
df["pct_ingresos"] = df["ingresos"].pct_change()

# cumsum() y cumprod()
df["total_ingresos"] = df["ingresos"].cumsum()
df["prod_ingresos"] = df["ingresos"].cumprod()

# where() y mask()
df["mayores_de_30"] = df["edad"].where(df["edad"] > 30, "≤30")
df["ocultar_menores"] = df["edad"].mask(df["edad"] < 30, "Oculto")

print("\nDataFrame con transformaciones:")
print(df)


Transformaciones por grupo con groupby().transform()

Cuando los datos están organizados en grupos (por ejemplo, categorías o regiones), groupby().transform() permite aplicar funciones estadísticas conservando la forma original del DataFrame. A diferencia de las agregaciones, estas transformaciones devuelven una estructura del mismo tamaño, lo cual es útil para crear nuevas columnas basadas en cálculos por grupo, como la media, el rango o la suma acumulada. Es una herramienta poderosa para enriquecer el análisis sin perder granularidad.

Función Descripción Ejemplo
'mean'Promedio por grupo.df.groupby('grupo')['valor'].transform('mean')
'sum'Suma por grupo.df.groupby('grupo')['valor'].transform('sum')
'std'Desviación estándar.df.groupby('grupo')['valor'].transform('std')
'min' / 'max'Valor mínimo o máximo del grupo.df.groupby('grupo')['valor'].transform('min')
'count'Cuenta elementos por grupo.df.groupby('grupo')['valor'].transform('count')
'rank'Rango dentro del grupo.df.groupby('grupo')['valor'].transform('rank')
'first' / 'last'Primer o último valor del grupo.df.groupby('grupo')['valor'].transform('first')
'median'El valor central del grupo cuando los datos están ordenados.df.groupby('grupo')['valor'].transform('median')

groupby(...).transform('mean')

Descripción: Calcula el promedio de cada grupo y retorna una Serie del mismo tamaño que el DataFrame original, asignando a cada fila el promedio correspondiente a su grupo.

Resultado: Serie del mismo tamaño que el DataFrame original con los promedios replicados por grupo.


groupby(...).transform('sum')

Descripción: Suma los valores dentro de cada grupo y los devuelve para cada elemento del grupo.

Resultado: Serie con la suma del grupo asignada a cada fila.


groupby(...).transform('std')

Descripción: Calcula la desviación estándar dentro de cada grupo. Útil para entender la dispersión de datos por grupo.

Resultado: Serie con la desviación estándar del grupo correspondiente.


groupby(...).transform('min')

Descripción: Retorna el valor mínimo de cada grupo y lo asigna a todas las filas del grupo.

Resultado: Serie con el valor mínimo repetido por cada fila del grupo.


groupby(...).transform('max')

Descripción: Obtiene el valor máximo por grupo. Cada fila del grupo obtiene ese valor como resultado.

Resultado: Serie del mismo tamaño con el valor máximo del grupo correspondiente.


groupby(...).transform('count')

Descripción: Cuenta cuántas observaciones tiene cada grupo (excluyendo NaN) y replica ese valor en todas las filas del grupo.

Resultado: Serie con el número de elementos no nulos por grupo.


groupby(...).transform('rank')

Descripción: Asigna un rango dentro de cada grupo, en orden creciente (por defecto). Ideal para generar rankings locales.

Resultado: Serie con valores de rango por grupo.


groupby(...).transform('first')

Descripción: Devuelve el primer valor de cada grupo y lo replica en todas las filas de dicho grupo.

Resultado: Serie con el primer valor del grupo aplicado a todas sus filas.


groupby(...).transform('last')

Descripción: Devuelve el último valor presente en cada grupo. Es útil cuando el orden es relevante (por ejemplo, series temporales).

Resultado: Serie con el último valor replicado por grupo.


groupby(...).transform('median')

Descripción: Calcula la mediana (el valor central) de cada grupo y lo asigna a cada fila del grupo.

Resultado: Serie con la mediana correspondiente a cada grupo.


El siguiente código es un ejemplo de como se puede utilizar cada uno las transformaciones que se pe pueden aplicar cuando se agrupan los datos.

    
import pandas as pd

# Crear un DataFrame de ejemplo
df = pd.DataFrame({
    "departamento": ["ventas", "ventas", "ventas", "marketing", "marketing", "finanzas"],
    "empleado": ["Ana", "Luis", "Pedro", "Sara", "Claudia", "Iván"],
    "ventas_mensuales": [1000, 1500, 1300, 1200, 1100, 900],
    "bono": [200, 250, 180, 220, 210, 190]
})

print("DataFrame original:")
print(df)

# Promedio de ventas por departamento
df["prom_ventas_dep"] = df.groupby("departamento")["ventas_mensuales"].transform("mean")

# Suma de bonos por departamento
df["total_bonos_dep"] = df.groupby("departamento")["bono"].transform("sum")

# Mediana de ventas por departamento
df["mediana_ventas_dep"] = df.groupby("departamento")["ventas_mensuales"].transform("median")

# Rango de bonos dentro del departamento
df["ranking_bono"] = df.groupby("departamento")["bono"].transform("rank")

# Valor máximo de ventas por departamento
df["max_ventas_dep"] = df.groupby("departamento")["ventas_mensuales"].transform("max")

# Valor mínimo de bono por departamento
df["min_bono_dep"] = df.groupby("departamento")["bono"].transform("min")

# Primer valor del grupo (ventas_mensuales)
df["primera_venta"] = df.groupby("departamento")["ventas_mensuales"].transform("first")

# Último valor del grupo (ventas_mensuales)
df["ultima_venta"] = df.groupby("departamento")["ventas_mensuales"].transform("last")

# Conteo de empleados por departamento
df["n_empleados_dep"] = df.groupby("departamento")["empleado"].transform("count")

print("\nDataFrame con transformaciones agrupadas:")
print(df)
    


Operaciones

En la siguiente tabla se resumen los métodos estadísticos más utilizados para análisis exploratorio en Pandas. Estos métodos permiten calcular promedios, medianas, valores acumulados y relaciones entre columnas numéricas de forma rápida y eficiente.

Método Descripción Ejemplo
mean() Calcula la media por columnas o filas. df.mean()
median() Calcula la mediana de los valores. df.median()
mode() Devuelve el valor más frecuente (moda). df.mode()
min() / max() Obtiene el mínimo y máximo por columna. df.min(), df.max()
std() / var() Desviación estándar y varianza. df.std(), df.var()
sum() Devuelve la suma total por columna. df.sum()
count() Cuenta los valores no nulos. df.count()
describe() Resumen estadístico de todas las columnas numéricas. df.describe()
corr() Calcula la correlación entre columnas numéricas. df.corr()
cumsum() / cumprod() Suma y producto acumulado. df.cumsum(), df.cumprod()

Una vez que los datos están limpios y estructurados, es momento de realizar operaciones que nos permitan entender patrones, agrupar información y transformar el contenido para extraer valor. Pandas ofrece funciones potentes como groupby(), apply(), map() y sort_values() que permiten aplicar lógicas complejas de forma eficiente.

En esta unidad aprenderás a:

  • Agrupar datos y calcular estadísticas agregadas.
  • Ordenar y reorganizar los datos.
  • Aplicar funciones personalizadas sobre columnas.
  • Fusionar y concatenar DataFrames.

Estas herramientas te ayudarán a responder preguntas clave del análisis y a preparar los datos para su visualización o modelado.

Este ejemplo utiliza groupby() para agrupar datos por una categoría y calcular el promedio de otra columna. Las transformaciones como esta permiten resumir y analizar grandes conjuntos de datos de manera eficiente.


import pandas as pd
df = pd.read_csv("datos.csv")
# Agrupar por columna y calcular promedio
promedios = df.groupby("categoria")["valor"].mean()
print(promedios)
            

Función df.groupby:

df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, observed=False, dropna=True)
            
Este método guarda un DataFrame en un archivo Excel, usando openpyxl para .xlsx o xlwt para .xls.

Parámetros:

Parámetro Tipo Valor por defecto Descripción
by str, list, Series o dict — Clave(s) para agrupar: nombre(s) de columna(s), índice, Serie o diccionario.
axis {0 o 'index', 1 o 'columns'} 0 Indica si se agrupa por filas (0) o columnas (1).
level int, str o list None Útil para agrupar por nivel en un índice jerárquico.
as_index bool True Si True, los grupos se usan como índice del resultado.
sort bool True Ordena los grupos por clave. Desactívalo para rendimiento en grandes volúmenes.
group_keys bool True Si True, añade claves de agrupamiento al resultado como índice.
observed bool False Para columnas categóricas: si True, solo combina categorías observadas.
dropna bool True Si False, incluye grupos donde la clave de agrupación es NaN.

Función df.mean:

DataFrame.mean(axis=0, skipna=True, numeric_only=False, **kwargs)
Series.mean(skipna=True, **kwargs)
En Pandas, mean() es un método que se utiliza para calcular el promedio (media aritmética) de los valores en un DataFrame o una Serie.Es una operación de agregación muy usada para análisis descriptivo. Notas:
  1. En Series: un valor float con la media.
  2. En DataFrame: una Series con el promedio por fila o columna, dependiendo del eje (axis).
  3. Si el DataFrame contiene datos no numéricos, se deben excluir o convertir para evitar errores, o usar numeric_only=True.

Parámetro Tipo Valor por defecto Descripción
axis {0 o 'index', 1 o 'columns'} 0 Para DataFrame: indica si se calcula la media por columnas (axis=0) o por filas (axis=1). No se aplica en Series.
skipna bool True Si es True, ignora los valores nulos (NaN) en el cálculo.
numeric_only bool False Si es True, solo incluye columnas numéricas. Solo aplica en DataFrame.
**kwargs — — Parámetros adicionales que se pasan internamente. Generalmente no se usan directamente.

Unidad 5: Visualización básica

Visualizar los datos es una de las formas más efectivas de entender tendencias, detectar anomalías y comunicar hallazgos. Aunque existen librerías especializadas como matplotlib o seaborn, Pandas ofrece una interfaz integrada para generar gráficos rápidamente a partir de un DataFrame.

En esta unidad aprenderás a:

  • Crear gráficos de líneas, barras y histogramas con .plot().
  • Combinar Pandas con matplotlib para personalizar visualizaciones.
  • Interpretar y mejorar la presentación de gráficos básicos.

Este conocimiento será útil tanto para exploración preliminar como para presentaciones de resultados.

El siguiente código muestra cómo generar una gráfica de barras directamente desde un DataFrame utilizando .plot() junto con matplotlib.pyplot. Esto facilita la exploración visual de los datos sin necesidad de pasos adicionales complejos.


import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("ventas.csv")
df["total"].plot(kind="bar")
plt.show()
            

Unidad 6: Proyecto integrador

En esta última unidad aplicarás todo lo aprendido para desarrollar un pequeño proyecto que simula un caso real de análisis de datos. Partirás de un archivo .csv, lo procesarás con Pandas, generarás una visualización con matplotlib y exportarás los resultados, todo dentro de un entorno virtual y usando buenas prácticas de desarrollo en Windows.

Este proyecto te permitirá:

  • Configurar un entorno aislado para tus proyectos de análisis.
  • Desarrollar un script limpio y documentado en Python.
  • Practicar lectura, transformación y visualización de datos.
  • Consolidar tus habilidades en una solución práctica y completa.

Al finalizar, contarás con un ejemplo funcional que puedes adaptar o ampliar en tus propios proyectos.

Entorno virtual y preparación

Este proyecto final guía al usuario en la creación de un entorno virtual, instalación de dependencias y escritura de un script que analiza un archivo CSV y genera una gráfica resumen. El objetivo es consolidar todo lo aprendido en un flujo de trabajo reproducible.


# Crear entorno virtual
python -m venv entorno_pandas
# Activar entorno (Windows)
entorno_pandas\Scripts\activate
# Instalar dependencias
pip install pandas matplotlib
                

Archivo de análisis


"""
analisis.py
Carga un archivo CSV, filtra valores y genera una gráfica.

Parámetros:
- archivo_csv (str): ruta del archivo con los datos.
- columna (str): nombre de la columna a analizar.
"""
import pandas as pd
import matplotlib.pyplot as plt

def analizar_datos(archivo_csv: str, columna: str):
    df = pd.read_csv(archivo_csv)
    conteo = df[columna].value_counts()
    conteo.plot(kind="bar")
    plt.title(f"Distribución de {columna}")
    plt.xlabel(columna)
    plt.ylabel("Frecuencia")
    plt.tight_layout()
    plt.savefig("reporte.png")

analizar_datos("datos.csv", "estado")