Python para usuarios de Excel: lee, filtra y resume tus datos con pandas
Guía práctica de pandas para quien ya sabe Excel: leer un .xlsx, filtrar, crear columnas, armar una tabla dinámica con pivot_table y guardar el reporte en Excel.

Si ya sabes filtrar, crear columnas con fórmulas y armar tablas dinámicas en Excel, ya entiendes buena parte de lo que hace pandas, la librería de Python para trabajar con tablas. La diferencia es que en Python cada paso queda escrito, se repite sin errores y funciona igual con 500 filas que con 5 millones.
En esta guía vas a leer un archivo de Excel con ventas, filtrarlo, crear columnas, resumirlo como una tabla dinámica y guardar el resultado en un Excel nuevo. Cada paso lleva su equivalente en Excel para que no te pierdas.
Lo que necesitas instalar
- Python 3 desde python.org (en Windows, marca la casilla “Add python.exe to PATH” durante la instalación).
- Las librerías pandas y openpyxl (esta última es la que permite leer y escribir archivos .xlsx). Abre una terminal y ejecuta:
pip install pandas openpyxl
Para escribir y ejecutar el código puedes usar Visual Studio Code, Jupyter Notebook o incluso el editor IDLE que viene con Python. Si prefieres no instalar nada, Google Colab funciona en el navegador.
Paso 1: leer el Excel
Supón un archivo ventas.xlsx con una hoja llamada Ventas y las columnas Fecha, Producto, Ciudad, Cantidad y Precio.
import pandas as pd
df = pd.read_excel("ventas.xlsx", sheet_name="Ventas")
print(df.head()) # primeras 5 filas
print(df.shape) # (filas, columnas)
df.info() # tipos de dato de cada columna
A la tabla en memoria se le llama DataFrame y, por costumbre, se nombra df. Es el equivalente a tu hoja con datos.
Un detalle útil. df.info() te dice si pandas leyó la Fecha como fecha (datetime64) y Cantidad como número (int64 o float64). Si algo aparece como object o str, es texto, igual que un número guardado como texto en Excel.
Paso 2: filtrar filas
En Excel usarías el botón de Filtro. En pandas escribes la condición entre corchetes:
# Solo las ventas de Manta
manta = df[df["Ciudad"] == "Manta"]
# Ventas de Manta con más de 10 unidades (Y = &)
grandes = df[(df["Ciudad"] == "Manta") & (df["Cantidad"] > 10)]
# Manta o Portoviejo
costa = df[df["Ciudad"].isin(["Manta", "Portoviejo"])]
Cada condición va entre paréntesis. Para “Y” se usa & y para “O” se usa |.
Paso 3: crear columnas calculadas
En Excel escribirías =D2*E2 y arrastrarías la fórmula hacia abajo. En pandas la operación se aplica a toda la columna de una vez:
df["Total"] = df["Cantidad"] * df["Precio"]
# Una columna con el mes, a partir de la fecha
df["Mes"] = df["Fecha"].dt.to_period("M").astype(str)
# Equivalente a un SI(): clasificar ventas
df["Tipo"] = df["Total"].apply(lambda t: "Grande" if t >= 100 else "Normal")
Paso 4: ordenar
# De mayor a menor total
df = df.sort_values("Total", ascending=False)
Paso 5: resumir como una tabla dinámica
Aquí es donde pandas brilla. Para ver el total vendido por ciudad, usas groupby:
por_ciudad = df.groupby("Ciudad", as_index=False)["Total"].sum()
print(por_ciudad)
Y para una tabla dinámica completa, con ciudades en filas y meses en columnas, usas pivot_table:
tabla = pd.pivot_table(
df,
index="Ciudad", # filas
columns="Mes", # columnas
values="Total", # valores
aggfunc="sum", # resumir con suma
fill_value=0, # celdas vacías como 0
margins=True, # agrega totales
margins_name="Total"
)
print(tabla)
Son las mismas cuatro decisiones que tomas al armar una tabla dinámica en Excel: qué va en filas, qué en columnas, qué valor y cómo resumirlo.
Paso 6: guardar el resultado en Excel
Puedes guardar varias tablas en hojas distintas del mismo archivo:
with pd.ExcelWriter("reporte_ventas.xlsx") as writer:
df.to_excel(writer, sheet_name="Detalle", index=False)
por_ciudad.to_excel(writer, sheet_name="Por ciudad", index=False)
tabla.to_excel(writer, sheet_name="Ciudad x Mes")
Abre reporte_ventas.xlsx y tendrás las tres hojas listas. El mes que viene, reemplaza ventas.xlsx por el archivo nuevo, ejecuta el script y el reporte se genera en segundos.
El script completo
import pandas as pd
df = pd.read_excel("ventas.xlsx", sheet_name="Ventas")
df["Total"] = df["Cantidad"] * df["Precio"]
df["Mes"] = df["Fecha"].dt.to_period("M").astype(str)
por_ciudad = (df.groupby("Ciudad", as_index=False)["Total"]
.sum()
.sort_values("Total", ascending=False))
tabla = pd.pivot_table(df, index="Ciudad", columns="Mes", values="Total",
aggfunc="sum", fill_value=0, margins=True, margins_name="Total")
with pd.ExcelWriter("reporte_ventas.xlsx") as writer:
df.to_excel(writer, sheet_name="Detalle", index=False)
por_ciudad.to_excel(writer, sheet_name="Por ciudad", index=False)
tabla.to_excel(writer, sheet_name="Ciudad x Mes")
print("Reporte listo")
Excel y pandas, lado a lado
| En Excel | En pandas |
|---|---|
| Abrir el archivo | pd.read_excel("archivo.xlsx") |
| Filtro | df[df["Ciudad"] == "Manta"] |
| Columna con fórmula | df["Total"] = df["Cantidad"] * df["Precio"] |
| Ordenar | df.sort_values("Total", ascending=False) |
| SUMAR.SI por ciudad | df.groupby("Ciudad")["Total"].sum() |
| Tabla dinámica | pd.pivot_table(...) |
| Quitar duplicados | df.drop_duplicates() |
| Guardar como | df.to_excel("nuevo.xlsx", index=False) |
Errores típicos al empezar
- FileNotFoundError: Python no encuentra el archivo. Pon el script en la misma carpeta que el Excel o usa la ruta completa, por ejemplo
r"C:Reportesventas.xlsx"(larevita problemas con las barras invertidas). - ImportError: Missing optional dependency ‘openpyxl’: falta instalar openpyxl con
pip install openpyxl. - KeyError: ‘Ciudad’: la columna se llama distinto en tu archivo, quizá con un espacio al final. Revisa con
print(df.columns). - PermissionError al guardar: el archivo de salida está abierto en Excel. Ciérralo y vuelve a ejecutar.
No necesitas dejar Excel para usar Python. La combinación más poderosa es usar Python para el trabajo repetitivo y pesado, y Excel o Power BI para presentar los resultados. En los próximos artículos veremos cómo combinar varios Excel en uno y cómo crear gráficos con matplotlib.
