Series y DataFrames: Los Fundamentos de Pandas
La Libreria Mas Importante de Data SciencePandas es, sin exageracion, la libreria que mas vas a usar en tu carrera como analista o cientifico de datos. Es la herramienta estandar para manipular datos tabulares (tablas con filas y columnas) en Python. Todo lo que hacias con Excel, ahora lo podes hacer con Pandas pero de forma automatizada, reproducible y con millones de filas.
import pandas as pd
import numpy as np
print(f"Pandas version: {pd.__version__}")
Series: Una Columna de Datos
Una Series es un array unidimensional con etiquetas (indice). Pensalo como una columna de una tabla de Excel.
# Crear una Series desde una lista
ventas = pd.Series([120, 135, 98, 145, 167, 189])
print(ventas)
# 0 120
# 1 135
# 2 98
# 3 145
# 4 167
# 5 189
# dtype: int64
# Series con indice personalizado
ventas_mensual = pd.Series(
[120, 135, 98, 145, 167, 189],
index=['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun'],
name='Ventas (miles)'
)
print(ventas_mensual)
print(f"\nVentas de Marzo: {ventas_mensual['Mar']}")
print(f"Ventas Q1: {ventas_mensual['Ene':'Mar'].sum()}")
Operaciones con Series
# Estadisticas
print(f"Promedio: {ventas_mensual.mean():.1f}")
print(f"Mediana: {ventas_mensual.median():.1f}")
print(f"Desv. Est.: {ventas_mensual.std():.1f}")
print(f"Total: {ventas_mensual.sum()}")
# Operaciones vectorizadas (como NumPy)
ventas_con_iva = ventas_mensual * 1.21
crecimiento = ventas_mensual.pct_change() * 100 # Cambio porcentual
# Filtrado booleano
ventas_altas = ventas_mensual[ventas_mensual > 140]
print(f"\nMeses con ventas > 140:\n{ventas_altas}")
# Metodos utiles
print(f"\nTop 3 meses: {ventas_mensual.nlargest(3).index.tolist()}")
print(f"Peor mes: {ventas_mensual.idxmin()} ({ventas_mensual.min()})")
DataFrame: Tu Tabla de Datos
Un DataFrame es una tabla bidimensional con filas y columnas etiquetadas. Es la estructura principal de Pandas.
# Crear un DataFrame desde un diccionario
df = pd.DataFrame({
'nombre': ['Ana Garcia', 'Carlos Lopez', 'Maria Rodriguez', 'Luis Fernandez', 'Sofia Martinez'],
'edad': [28, 34, 25, 42, 31],
'departamento': ['Marketing', 'Ventas', 'IT', 'Ventas', 'Marketing'],
'salario': [65000, 72000, 85000, 68000, 71000],
'evaluacion': [4.5, 3.8, 4.9, 3.2, 4.1]
})
print(df)
print(f"\nForma: {df.shape}") # (5, 5) = 5 filas, 5 columnas
print(f"Columnas: {df.columns.tolist()}")
print(f"Tipos de datos:\n{df.dtypes}")
Exploracion inicial (lo primero que haces con cualquier dataset)
# Las 5 funciones que SIEMPRE ejecutas al cargar un dataset
print(df.head()) # Primeras 5 filas
print(df.tail(3)) # Ultimas 3 filas
print(df.info()) # Tipos de datos, valores no nulos
print(df.describe()) # Estadisticas de columnas numericas
print(df.shape) # Dimensiones
Seleccion de Datos
Seleccionar columnas
# Una columna (retorna Series)
nombres = df['nombre']
print(type(nombres)) # <class 'pandas.core.series.Series'>
# Multiples columnas (retorna DataFrame)
subset = df[['nombre', 'salario', 'departamento']]
print(subset)
# Acceso con punto (solo si el nombre no tiene espacios)
print(df.edad.mean())
Seleccionar filas
# Por indice numerico (iloc)
print(df.iloc[0]) # Primera fila
print(df.iloc[1:4]) # Filas 1 a 3
print(df.iloc[-1]) # Ultima fila
# Por etiqueta (loc)
print(df.loc[0]) # Fila con indice 0
print(df.loc[0:2, ['nombre', 'salario']]) # Filas 0-2, columnas especificas
# Filtrado condicional (lo mas importante)
mayores_30 = df[df['edad'] > 30]
print(f"\nEmpleados mayores de 30:\n{mayores_30}")
# Multiples condiciones
ventas_senior = df[(df['departamento'] == 'Ventas') & (df['edad'] > 30)]
print(f"\nVendedores senior:\n{ventas_senior}")
# Operador isin
seleccion = df[df['departamento'].isin(['Marketing', 'IT'])]
print(f"\nMarketing o IT:\n{seleccion}")
Crear y Modificar Columnas
# Nueva columna calculada
df['salario_mensual'] = df['salario'] / 12
df['bono_anual'] = df['salario'] * df['evaluacion'] / 100
# Columna condicional
df['nivel'] = df['evaluacion'].apply(lambda x: 'Alto' if x >= 4.0 else 'Normal')
# Alternativa con np.where
df['senior'] = np.where(df['edad'] >= 35, 'Si', 'No')
# Categorizar con pd.cut
df['rango_salarial'] = pd.cut(
df['salario'],
bins=[0, 65000, 75000, 100000],
labels=['Bajo', 'Medio', 'Alto']
)
print(df[['nombre', 'salario', 'rango_salarial', 'nivel', 'senior']])
Ordenar Datos
# Ordenar por una columna
df_ordenado = df.sort_values('salario', ascending=False)
print("Ordenado por salario (mayor a menor):")
print(df_ordenado[['nombre', 'salario']])
# Ordenar por multiples columnas
df_multi = df.sort_values(['departamento', 'evaluacion'], ascending=[True, False])
print("\nOrdenado por departamento y evaluacion:")
print(df_multi[['nombre', 'departamento', 'evaluacion']])
Video Recomendado
Pandas Tutorial Completo en Espanol - Desde Cero
Ejercicio Practico
Crea un notebook 06_pandas_basico.ipynb:
- Crea un DataFrame con datos de 20 estudiantes (nombre, edad, carrera, promedio, semestre)
- Explora el dataset con head, info, describe, shape
- Filtra estudiantes con promedio > 8.0
- Crea una columna 'estado' que sea 'Aprobado' si promedio >= 6.0, sino 'Reprobado'
- Ordena por promedio descendente y muestra el top 5
- Calcula el promedio de notas por carrera
💡 Concepto Clave
Revisemos los puntos más importantes de esta lección antes de continuar.
Resumen
- Series: Array 1D con etiquetas (una columna)
- DataFrame: Tabla 2D con filas y columnas etiquetadas
- Exploracion: head(), info(), describe(), shape
- Seleccion: df['col'], df.iloc[], df.loc[], filtros booleanos
- Nuevas columnas: apply(), np.where(), pd.cut()
- Ordenar: sort_values()
🧠 Pon a prueba tu conocimiento
¿Cuál es el aspecto más importante que aprendiste en esta lección?
- Comprendo el concepto principal y puedo explicarlo con mis palabras
- Entiendo cómo aplicarlo en mi situación específica
- Necesito repasar algunas partes antes de continuar
- Quiero ver más ejemplos prácticos del tema
✅ ¡Excelente! Continúa con la siguiente lección para profundizar más.