Introducción a los DataFrames de Dask
Sustituya pd.read_csv y pd.DataFrame por sus equivalentes de dask, llame a compute() para activar la ejecución y perfile los grafos de tareas.
Introducción a los DataFrames de Dask es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué es Dask?
Dask es una biblioteca de computación paralela para Python que amplía NumPy y Pandas para trabajar con conjuntos de datos más grandes que la RAM disponible. Su módulo dask.dataframe proporciona una API de DataFrame casi idéntica a la de Pandas, pero, en lugar de ejecutar las operaciones inmediatamente, Dask crea un grafo de tareas y las ejecuta de forma diferida cuando se llama a .compute(). Esto permite paralelizar el trabajo en varios núcleos o incluso en varias máquinas con cambios mínimos en el código.
Instalación e importación de Dask
Dask se instala con pip install dask[dataframe]. La convención de importación es import dask.dataframe as dd. Internamente, un Dask DataFrame se divide en muchos DataFrames de Pandas más pequeños, cada uno de los cuales se procesa de forma independiente. Las operaciones sobre el Dask DataFrame crean un grafo de tareas diferido; no se ejecuta nada hasta que se llama a .compute(). Esta separación entre describir y ejecutar el cálculo es la idea clave de Dask.
import dask.dataframe as dd
# Read a large CSV — returns a Dask DataFrame immediately (no data loaded yet)
ddf = dd.read_csv('large_sales.csv')
print(type(ddf)) # dask.dataframe.core.DataFrame
print(ddf.columns.tolist())
print(ddf.dtypes)Dask frente a Pandas: la diferencia clave
Con Pandas, cada operación se ejecuta de forma inmediata y anticipada. Con Dask, las operaciones devuelven otro objeto de Dask que representa el cálculo diferido. Dask no lee los datos ni ejecuta el grafo de tareas hasta que se llama a .compute(). Esta ejecución diferida permite a Dask optimizar el plan antes de ejecutarlo; por ejemplo, puede fusionar filtros consecutivos para evitar cargar los datos varias veces. Piense en ello como una receta: Dask escribe la receta y .compute() prepara el plato.
import dask.dataframe as dd
ddf = dd.read_csv('sales.csv')
# This does NOT run yet — just builds the task graph
filtered = ddf[ddf['amount'] > 1000]
agg = filtered.groupby('region')['amount'].sum()
print(type(agg)) # dask.dataframe.core.Series
# NOW execute everything
result = agg.compute()
print(result)Particiones: el concepto fundamental
Un Dask DataFrame se divide en particiones, cada una de las cuales es un DataFrame de Pandas normal. De forma predeterminada, dd.read_csv crea una partición por archivo (o una por cada 128 MB en archivos grandes). Puede controlar esto con blocksize. Al consultar ddf.npartitions verá cuántas particiones existen. Un mayor número de particiones permite más paralelismo, pero añade sobrecarga; un menor número reduce la sobrecarga, pero limita el paralelismo. Normalmente, el punto óptimo se encuentra en unos pocos cientos de particiones.
import dask.dataframe as dd
ddf = dd.read_csv('data/*.csv') # Read multiple CSV files at once
print('Number of partitions:', ddf.npartitions)
# Access a single partition as a Pandas DataFrame
first_partition = ddf.get_partition(0).compute()
print('Partition 0 shape:', first_partition.shape)Operaciones conocidas de Pandas en Dask
La mayoría de las operaciones habituales de Pandas funcionan de forma idéntica en Dask: .head(), .tail(), .describe(), la indexación booleana, .groupby(), .merge() y .assign() tienen equivalentes en Dask. La diferencia principal es que debe llamar a .compute() para materializar el resultado. Las operaciones que Pandas resuelve en milisegundos pueden tardar segundos en Dask debido a la sobrecarga del grafo de tareas; por eso, use Pandas para datos pequeños y Dask cuando los datos no quepan en la RAM.
import dask.dataframe as dd
ddf = dd.read_csv('transactions.csv')
# Filtering — same syntax as Pandas
high_value = ddf[ddf['amount'] > 500]
# GroupBy aggregation
by_region = high_value.groupby('region')['amount'].mean()
# Execute
result = by_region.compute()
print(result.sort_values(ascending=False))Lectura de varios archivos con patrones glob
Una de las funciones más útiles de Dask es leer varios archivos a la vez mediante patrones glob. dd.read_csv('data/2024-*.csv') lee todos los archivos coincidentes y crea una partición por archivo. Es ideal para datos almacenados en archivos particionados por mes o por día, un patrón habitual en los lagos de datos. Dask alinea los esquemas automáticamente; es equivalente a recorrer los archivos manualmente y concatenarlos con Pandas, pero mucho más sencillo.
import dask.dataframe as dd
# Read all monthly files at once
ddf = dd.read_csv('sales/2024-*.csv',
dtype={'order_id': 'int32',
'amount': 'float32'})
print(f'Partitions: {ddf.npartitions}') # One per file
print(f'Total rows (lazy): {len(ddf)}') # This triggers a compute!El método visualize() para grafos de tareas
Antes de ejecutar una canalización compleja de Dask, puede inspeccionar el grafo de tareas llamando a result.visualize(), que genera un diagrama PNG de todos los pasos del cálculo. Esto resulta útil para entender qué ejecutará Dask y para depurar una lentitud inesperada. El grafo muestra cómo fluyen las particiones por los pasos de filtrado, groupby y agregación, lo que facilita detectar cálculos redundantes. Requiere el paquete graphviz.
import dask.dataframe as dd
ddf = dd.read_csv('orders.csv')
pipeline = (
ddf[ddf['status'] == 'completed']
.groupby('product_id')['revenue']
.sum()
)
# Visualise the task graph (saves to PNG)
# pipeline.visualize('task_graph.png')
# Check number of tasks in the graph
print('Number of tasks:', len(pipeline.__dask_graph__()))Aplicación de funciones personalizadas con map_partitions
Cuando necesite aplicar una función personalizada de Pandas a un Dask DataFrame, use ddf.map_partitions(func). Esto aplica func a cada partición de forma independiente y devuelve un nuevo Dask DataFrame. La función recibe un DataFrame normal de Pandas y debe devolver otro. Es el equivalente en Dask de df.apply() y permite integrar Dask con código que solo entiende Pandas.
import dask.dataframe as dd
import pandas as pd
def normalise_chunk(df):
df = df.copy()
df['amount_norm'] = (df['amount'] - df['amount'].mean()) / df['amount'].std()
return df
ddf = dd.read_csv('data.csv')
normalised = ddf.map_partitions(normalise_chunk)
result = normalised[['order_id', 'amount_norm']].compute()
print(result.head())Opciones del planificador de Dask
Dask dispone de varios planificadores que controlan cómo se ejecutan las tareas. El planificador 'synchronous' ejecuta las tareas secuencialmente en el hilo actual (es útil para depurar). El planificador 'threads' utiliza un conjunto de hilos (adecuado para trabajos limitados por E/S). El planificador 'processes' inicia varios procesos para trabajos limitados por la CPU (evita el GIL de Python). Un clúster distribuido de Dask permite ejecutar tareas en varias máquinas. Especifique el planificador mediante compute(scheduler='threads').
import dask.dataframe as dd
ddf = dd.read_csv('data.csv')
agg = ddf.groupby('category')['sales'].sum()
# Choose scheduler based on workload
result_sync = agg.compute(scheduler='synchronous') # sequential, easy to debug
result_threads = agg.compute(scheduler='threads') # parallel I/O
result_processes = agg.compute(scheduler='processes') # parallel CPUConversión entre Dask y Pandas
Es habitual procesar un conjunto de datos grande con Dask y después llevar el resultado agregado a Pandas para el análisis o la visualización finales. Use .compute() para convertir un Dask DataFrame en un DataFrame de Pandas. En la dirección contraria, dd.from_pandas(df, npartitions=4) convierte un DataFrame de Pandas en un Dask DataFrame, lo que resulta útil para probar código de Dask con datos pequeños antes de ampliarlo al conjunto de datos completo.
import pandas as pd
import dask.dataframe as dd
# Start with a small Pandas DF for testing
df_small = pd.DataFrame({'a': range(100), 'b': range(100, 200)})
# Convert to Dask for development/testing
ddf = dd.from_pandas(df_small, npartitions=4)
result = ddf.groupby('a')['b'].sum().compute()
print(type(result)) # pandas.Series
print(result.head())Cuándo usar Dask, Pandas o SQL
Dask no siempre es la herramienta adecuada. Use Pandas cuando sus datos quepan en la RAM (menos de unos pocos GB); es más sencillo y rápido porque tiene menos sobrecarga. Use Dask cuando los datos superen la RAM disponible, pero quiera una sintaxis similar a la de Pandas y paralelismo en una sola máquina. Use SQL o una base de datos cuando los datos residan en una base de datos relacional y las agregaciones puedan delegarse al motor de la base de datos. Use Spark o BigQuery cuando necesite procesamiento distribuido en varias máquinas a escala de petabytes.
Comprobación rápida
Ponga a prueba su comprensión de los conceptos de análisis de datos de esta lección.
Repaso de la lección
En esta lección ha aprendido que los Dask DataFrames son colecciones evaluadas de forma diferida de particiones de Pandas con una API conocida; .compute() inicia la ejecución real del grafo de tareas; y map_partitions permite aplicar cualquier función personalizada de Pandas a todas las particiones. A continuación, veremos el formato Parquet como alternativa columnar rápida al CSV para almacenar conjuntos de datos grandes.
Preguntas frecuentes
¿La lección «Introducción a los DataFrames de Dask» es gratis?
Sí — el texto completo de «Introducción a los DataFrames de Dask» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Introducción a los DataFrames de Dask»?
Sustituya pd.read_csv y pd.DataFrame por sus equivalentes de dask, llame a compute() para activar la ejecución y perfile los grafos de tareas. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Pandas & NumPy Academy?
No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Introducción a los DataFrames de Dask»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?
Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Transmitir CSV con chunksize
- Agregación incremental entre bloques
- Introducción a los DataFrames de Dask
- Parquet: almacenamiento columnar rápido