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.
pip install pandas
Series y DataFrameEjemplo 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. |
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:
.csv y .xlsx.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)
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)
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)
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. |
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:
NaN).
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)
| 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')
| 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. |
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á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á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á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á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á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á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á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ámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
axis | {0 o 'index', 1 o 'columns'} | None | El eje a lo largo del cual rellenar los valores. |
inplace | bool | False | Si es True, modifica el objeto original. |
limit | int | None | Máximo número de valores consecutivos a rellenar. |
downcast | dict o str | None | Intento 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ámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
axis | {0 o 'index', 1 o 'columns'} | None | El eje sobre el cual aplicar el relleno. |
inplace | bool | False | Si True, modifica el objeto original. |
limit | int | None | Máximo de valores consecutivos a rellenar. |
downcast | dict o str | None | Intento 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.
| 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ámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
axis | {0 o 'index', 1 o 'columns'} | 0 | El eje sobre el cual calcular los rangos. |
method | str | 'average' | Método de asignación de empates: 'average', 'min', 'max', 'first' o 'dense'. |
numeric_only | bool o None | None | Si se usa en DataFrame, limita el cálculo a columnas numéricas. |
na_option | str | 'keep' | Controla cómo se manejan los NaN: 'keep', 'top' o 'bottom'. |
ascending | bool | True | Determina si el ranking es en orden ascendente (True) o descendente (False). |
pct | bool | False | Si 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ámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
periods | int | 1 | Número de periodos hacia atrás para calcular la diferencia. |
axis | {0 o 'index', 1 o 'columns'} | 0 | El 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ámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
periods | int | 1 | Número de periodos para calcular el cambio porcentual. |
fill_method | str o None | 'pad' | Método para llenar valores nulos antes del cálculo. |
limit | int o None | None | Límite máximo de valores a llenar consecutivamente. |
freq | str o DateOffset | None | Solo para series temporales. Desplazamiento basado en fecha. |
axis | {0, 1, 'index', 'columns'} | 0 | El 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ámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
axis | {0 o 'index', 1 o 'columns'} | None | El eje a lo largo del cual se acumula. |
skipna | bool | True | Ignora 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ámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
axis | {0 o 'index', 1 o 'columns'} | None | El eje a lo largo del cual calcular el producto. |
skipna | bool | True | Ignora 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ámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
cond | bool array | — | Condición booleana que determina qué valores conservar. |
other | scalar, Series o DataFrame | NaN | Valor alternativo a asignar donde la condición es falsa. |
inplace | bool | False | Si es True, modifica el objeto original. |
axis | int o str | None | Eje sobre el cual aplicar la condición. |
level | int o str | None | En índices jerárquicos, especifica el nivel a comparar. |
errors | str | '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ámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
cond | bool array | — | Condición booleana donde se aplicará el reemplazo. |
other | scalar, Series o DataFrame | NaN | Valor alternativo a colocar donde se cumpla la condición. |
inplace | bool | False | Si True, modifica el objeto original. |
axis | int o str | None | Eje sobre el cual aplicar la condición. |
level | int o str | None | En MultiIndex, permite seleccionar un nivel para aplicar la máscara. |
errors | str | '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)
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)
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:
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)
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)
| 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. |
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:
.plot().matplotlib para personalizar visualizaciones.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()
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á:
Al finalizar, contarás con un ejemplo funcional que puedes adaptar o ampliar en tus propios proyectos.
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
"""
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")