pandas es la biblioteca de Python que te permite cargar, organizar y explorar datos tabulares en segundos.
En esta lección aprenderás a importar archivos CSV y Excel, y a usar las funciones básicas de exploración. Usaremos ejemplos con datos de ventas al estilo de Liverpool y Bimbo.
¿Qué es un DataFrame?
Un DataFrame es la estructura principal de pandas. Es una tabla con filas y columnas, igual que una hoja de Excel.
Cada columna tiene un nombre y un tipo de dato. Cada fila representa un registro, por ejemplo, una venta.
Cómo importar pandas
Antes de cargar cualquier archivo, importa la biblioteca. La convención estándar es usar el alias pd:
import pandas as pd
Si ves el error ModuleNotFoundError, revisa la lección anterior. Debes activar tu entorno virtual e instalar pandas con pip install pandas.
Cargar un archivo CSV
Usa pd.read_csv() para leer archivos de valores separados por comas.
Estructura
df = pd.read_csv("ruta/al/archivo.csv")
Ejemplo 1 — Ventas de Liverpool
Supón que tienes un archivo ventas_liverpool.csv con este contenido:
fecha,producto,cantidad,precio_unitario
2024-01-05,Televisor,3,8500
2024-01-06,Lavadora,1,12500
2024-01-07,Cafetera,5,1200
2024-01-08,Televisor,2,8500
2024-01-09,Refrigerador,1,18500
Carga el archivo así:
df = pd.read_csv("ventas_liverpool.csv")
print(df)
Salida esperada:
fecha producto cantidad precio_unitario
0 2024-01-05 Televisor 3 8500
1 2024-01-06 Lavadora 1 12500
2 2024-01-07 Cafetera 5 1200
3 2024-01-08 Televisor 2 8500
4 2024-01-09 Refrigerador 1 18500
Parámetros útiles de read_csv
| Parámetro | Para qué sirve | Ejemplo |
|---|---|---|
sep |
Define el separador | sep=";" |
encoding |
Codificación del archivo | encoding="utf-8" |
header |
Fila que contiene los nombres de columna | header=0 |
usecols |
Columnas que deseas cargar | usecols=["producto","precio_unitario"] |
nrows |
Número de filas a cargar | nrows=100 |
Si tu archivo usa punto y coma como separador (común en exportaciones del SAT), escribe pd.read_csv("archivo.csv", sep=";").
Cargar un archivo Excel
Usa pd.read_excel() para archivos .xlsx o .xls.
Estructura
df = pd.read_excel("ruta/al/archivo.xlsx", sheet_name="Hoja1")
Necesitas la biblioteca openpyxl instalada. Si no la tienes, ejecuta pip install openpyxl.
Ejemplo 2 — Producción de Bimbo
Supón que tienes un archivo produccion_bimbo.xlsx con la hoja Enero:
df_bimbo = pd.read_excel(
"produccion_bimbo.xlsx",
sheet_name="Enero"
)
print(df_bimbo.head())
El parámetro sheet_name acepta el nombre de la hoja o su índice numérico (empezando en 0).
Explorar el DataFrame
Una vez que cargaste los datos, lo primero es conocer su estructura. pandas tiene funciones específicas para esto.
.head() y .tail()
.head(n) muestra las primeras n filas. El valor por defecto es 5.
print(df.head(3))
.tail(n) muestra las últimas n filas. Útil para ver si el archivo terminó bien.
print(df.tail(2))
.shape
.shape devuelve una tupla (filas, columnas). No lleva paréntesis porque es un atributo, no un método.
print(df.shape)
# Salida: (5, 4)
Eso significa 5 filas y 4 columnas en el ejemplo de Liverpool.
.dtypes
.dtypes muestra el tipo de dato de cada columna.
print(df.dtypes)
Salida:
fecha object
producto object
cantidad int64
precio_unitario int64
dtype: object
Cuando una columna de fechas aparece como object, debes convertirla con pd.to_datetime().
.info()
.info() combina varios datos en una sola vista: tipo de dato, valores no nulos y uso de memoria.
df.info()
Salida:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 fecha 5 non-null object
1 producto 5 non-null object
2 cantidad 5 non-null int64
3 precio_unitario 5 non-null int64
dtypes: int64(2), object(2)
memory usage: 292.0+ bytes
Revisa siempre la columna Non-Null Count. Si hay menos valores que filas, tienes datos faltantes.
.describe()
.describe() genera estadísticas descriptivas de las columnas numéricas.
print(df.describe())
Salida:
cantidad precio_unitario
count 5.0 5.0
mean 2.4 9840.0
std 1.5 6317.7
min 1.0 1200.0
25% 1.0 8500.0
50% 2.0 8500.0
75% 3.0 12500.0
max 5.0 18500.0
La columna precio_unitario tiene un valor mínimo de $1,200 (cafetera) y un máximo de $18,500 (refrigerador).
.value_counts()
.value_counts() cuenta cuántas veces aparece cada valor en una columna.
print(df["producto"].value_counts())
Salida:
producto
Televisor 2
Lavadora 1
Cafetera 1
Refrigerador 1
Name: producto, dtype: int64
Esto te dice que el Televisor fue el producto más vendido en el período.
Calcular columnas nuevas
Ejemplo 3 — Ingreso total por venta
Multiplica cantidad por precio_unitario para crear la columna ingreso_total:
df["ingreso_total"] = df["cantidad"] * df["precio_unitario"]
print(df[["producto", "ingreso_total"]])
Salida:
producto ingreso_total
0 Televisor 25500
1 Lavadora 12500
2 Cafetera 6000
3 Televisor 17000
4 Refrigerador 18500
El ingreso total del período es:
total = df["ingreso_total"].sum()
print(f"Ingreso total: ${total:,.0f}")
# Salida: Ingreso total: $79,500
Errores comunes
Error 1 — Ruta incorrecta del archivo
Si escribes pd.read_csv("ventas.csv") y el archivo está en otra carpeta, obtendrás FileNotFoundError.
Solución: usa rutas absolutas o coloca el archivo en la misma carpeta que tu script. Puedes verificar tu carpeta actual con:
import os
print(os.getcwd())
Error 2 — Codificación incorrecta
Los archivos exportados desde sistemas mexicanos a veces usan latin-1 en lugar de utf-8. Verás caracteres extraños en los acentos.
Solución: agrega el parámetro encoding:
df = pd.read_csv("ventas.csv", encoding="latin-1")
Error 3 — Confundir .shape con .shape()
.shape es un atributo, no un método. Si escribes df.shape() obtendrás TypeError: 'tuple' object is not callable.
Solución: escribe siempre df.shape sin paréntesis.
Error 4 — Olvidar instalar openpyxl
Si intentas abrir un .xlsx sin esta biblioteca, verás ModuleNotFoundError: No module named 'openpyxl'.
Solución: instala con pip install openpyxl dentro de tu entorno virtual activo.
Tabla de referencia rápida
| Función / Atributo | Qué devuelve | Ejemplo |
|---|---|---|
pd.read_csv() |
DataFrame desde CSV | pd.read_csv("ventas.csv") |
pd.read_excel() |
DataFrame desde Excel | pd.read_excel("reporte.xlsx") |
.head(n) |
Primeras n filas | df.head(5) |
.tail(n) |
Últimas n filas | df.tail(3) |
.shape |
Tupla (filas, columnas) | df.shape |
.dtypes |
Tipos de dato por columna | df.dtypes |
.info() |
Resumen estructural | df.info() |
.describe() |
Estadísticas numéricas | df.describe() |
.value_counts() |
Frecuencia de valores | df["col"].value_counts() |
.sum() |
Suma de una columna | df["col"].sum() |
Puntos clave
- Usa
pd.read_csv()para archivos CSV ypd.read_excel()para archivos Excel; ambas funciones aceptan parámetros opcionales comosepyencoding. - Siempre ejecuta
.info()al cargar un nuevo dataset para detectar columnas con valores nulos o tipos de dato incorrectos. .describe()te da en segundos la distribución estadística de tus columnas numéricas: media, mínimo, máximo y percentiles.- Crea columnas nuevas directamente con operaciones aritméticas entre columnas existentes del DataFrame.
- Verifica la codificación del archivo si ves caracteres extraños; los sistemas mexicanos frecuentemente exportan en
latin-1.