El análisis de datos con Python resulta mucho más práctico cuando se combinan NumPy y Pandas. NumPy proporciona arrays eficientes y operaciones matemáticas vectorizadas. Pandas añade tablas con etiquetas, limpieza de datos, agrupaciones, filtros, uniones y lectura de archivos.
Estas bibliotecas suelen trabajar juntas. NumPy se encarga del cálculo numérico, mientras que Pandas organiza la información en filas y columnas fáciles de explorar. En esta guía aprenderás un flujo completo: instalar las herramientas, cargar datos, revisar tipos, limpiar valores ausentes, calcular métricas, agrupar resultados y exportar un informe.
Qué significa analizar datos
Analizar datos consiste en recopilar, limpiar, transformar, explorar e interpretar información. Un proyecto puede intentar responder preguntas como:
- ¿Qué ocurrió durante un periodo?
- ¿Qué productos o categorías rindieron mejor?
- ¿Existen valores ausentes o incoherentes?
- ¿Cómo cambia una métrica a lo largo del tiempo?
- ¿Qué patrones merecen una investigación adicional?
Para profundizar en cada biblioteca, consulta las guías de Pandas para principiantes y NumPy con Python.
Preparar el entorno
Crea un entorno virtual antes de instalar dependencias:
python -m venv .venv
# Windows
.venv\Scripts\activate
# macOS o Linux
source .venv/bin/activate
python -m pip install numpy pandas matplotlibLa guía de venv en Python explica cómo aislar versiones y seleccionar el intérprete correcto.
Importa las bibliotecas con sus alias convencionales:
import numpy as np
import pandas as pdArrays de NumPy
Un array almacena valores de un tipo compatible y permite realizar operaciones sobre todos ellos sin escribir un bucle manual:
prices = np.array([12.50, 8.90, 15.00, 6.75])
quantities = np.array([4, 8, 3, 10])
totals = prices * quantities
print(totals)
print(totals.sum())Con listas normales, multiplicar dos listas no produce una multiplicación elemento por elemento. NumPy está diseñado para este tipo de cálculo.
La guía oficial de NumPy para principiantes explica dimensiones, formas, indexación y vectorización.
Operaciones frecuentes con NumPy
scores = np.array([72, 88, 91, 65, 84])
print(scores.mean())
print(scores.min())
print(scores.max())
print(scores.std())
print(scores[scores >= 80])La expresión scores >= 80 crea una máscara booleana. Al utilizarla como índice, el array devuelve solamente los valores que cumplen la condición.
Series y DataFrames
Una Series es una colección unidimensional con etiquetas. Un DataFrame es una tabla bidimensional:
sales = pd.DataFrame({
"product": ["Notebook", "Mouse", "Keyboard", "Mouse"],
"quantity": [2, 5, 3, 4],
"unit_price": [950.00, 25.00, 70.00, 25.00],
})
print(sales)Un DataFrame puede contener diferentes tipos entre columnas. Pandas utiliza NumPy para muchas operaciones, pero añade nombres de columnas, índices y funciones específicas para tablas.
Cargar CSV y Excel
data = pd.read_csv("sales.csv")Para Excel:
data = pd.read_excel("sales.xlsx")Las guías sobre archivos CSV en Python e importación de Excel con Pandas presentan configuraciones de delimitadores, hojas, encabezados y exportación.
Inspeccionar antes de analizar
Después de cargar un archivo, revisa su estructura:
print(data.head())
print(data.shape)
print(data.columns)
print(data.dtypes)
data.info()head() muestra las primeras filas; shape indica filas y columnas; dtypes revela los tipos. No empieces a calcular métricas sin comprobar que los datos fueron interpretados correctamente.
Seleccionar columnas y filas
Selecciona una columna con corchetes:
products = sales["product"]Para varias columnas:
summary = sales[["product", "quantity"]]loc utiliza etiquetas y iloc posiciones:
print(sales.loc[0, "product"])
print(sales.iloc[0:2, 0:3])Filtrar registros
large_orders = sales[sales["quantity"] >= 4]
print(large_orders)Para combinar condiciones, utiliza & y |, con paréntesis alrededor de cada comparación:
filtered = sales[
(sales["quantity"] >= 3)
& (sales["unit_price"] < 100)
]Crear columnas calculadas
La aritmética vectorizada evita recorrer cada fila:
sales["revenue"] = (
sales["quantity"] * sales["unit_price"]
)NumPy también permite condiciones:
sales["order_size"] = np.where(
sales["revenue"] >= 200,
"large",
"small",
)Valores ausentes
Cuenta los valores vacíos:
print(data.isna().sum())Rellena solamente cuando exista una regla lógica:
data["discount"] = data["discount"].fillna(0)Elimina filas cuando faltan campos indispensables:
data = data.dropna(
subset=["product", "quantity"]
)No reemplaces todos los valores ausentes por cero. Un precio ausente, una categoría vacía y una fecha desconocida representan problemas diferentes.
Corregir tipos de datos
data["quantity"] = pd.to_numeric(
data["quantity"],
errors="coerce",
)
data["date"] = pd.to_datetime(
data["date"],
errors="coerce",
)errors="coerce" convierte valores inválidos en ausentes para que puedan ser detectados y tratados.
Agrupar y resumir
product_summary = (
sales.groupby("product", as_index=False)
.agg(
units=("quantity", "sum"),
revenue=("revenue", "sum"),
average_price=("unit_price", "mean"),
)
.sort_values("revenue", ascending=False)
)
print(product_summary)groupby() es esencial para informes por producto, cliente, región o periodo.
Ordenar y obtener los mejores resultados
top_orders = (
sales.sort_values("revenue", ascending=False)
.head(3)
)Para una columna numérica también puedes utilizar:
print(sales.nlargest(3, "revenue"))Combinar tablas
products = pd.DataFrame({
"product_id": [1, 2],
"category": ["Computers", "Accessories"],
})
orders = pd.DataFrame({
"product_id": [1, 2, 2],
"quantity": [1, 3, 2],
})
combined = orders.merge(
products,
on="product_id",
how="left",
)Antes de una unión, comprueba si las claves deberían ser únicas. Claves duplicadas pueden multiplicar filas inesperadamente.
Flujo completo de análisis
import numpy as np
import pandas as pd
sales = pd.read_csv("sales.csv")
sales.columns = sales.columns.str.strip().str.lower()
sales["quantity"] = pd.to_numeric(
sales["quantity"], errors="coerce"
)
sales["unit_price"] = pd.to_numeric(
sales["unit_price"], errors="coerce"
)
sales = sales.dropna(
subset=["product", "quantity", "unit_price"]
)
sales["revenue"] = (
sales["quantity"] * sales["unit_price"]
)
sales["performance"] = np.where(
sales["revenue"] >= sales["revenue"].median(),
"above median",
"below median",
)
report = (
sales.groupby("product", as_index=False)
.agg(
units=("quantity", "sum"),
revenue=("revenue", "sum"),
)
.sort_values("revenue", ascending=False)
)
report.to_csv("sales_report.csv", index=False)
print(report)Este flujo carga, normaliza, convierte, limpia, calcula, agrupa, ordena y exporta.
Crear gráficos
report.plot(
x="product",
y="revenue",
kind="bar",
title="Revenue by Product",
)La guía de Matplotlib para principiantes explica etiquetas, leyendas, tipos de gráficos y exportación.
Errores frecuentes
- Analizar antes de revisar tipos y valores ausentes.
- Utilizar bucles cuando una operación vectorizada es más clara.
- Sobrescribir los datos originales antes de validar el resultado.
- Ignorar espacios y diferencias de mayúsculas en nombres de columnas.
- Unir tablas sin revisar claves duplicadas.
- Extraer conclusiones de una muestra pequeña o sesgada.
- Redondear valores demasiado pronto.
Buenas prácticas
Conserva los datos originales, guarda una versión limpia por separado, documenta las transformaciones y valida totales en cada etapa. Divide carga, limpieza, análisis y exportación en funciones o módulos.
Los tutoriales oficiales de introducción a Pandas ofrecen ejercicios adicionales con tablas reales.
Conclusión
NumPy proporciona arrays y cálculo numérico eficiente; Pandas añade tablas, limpieza, filtros, agrupaciones y uniones. Empieza con un CSV pequeño, inspecciona cada columna, corrige tipos, crea una métrica, agrupa resultados y exporta un informe. Ese flujo es la base de proyectos de visualización, estadística y machine learning.




