Manipulación de Datos con Pandas
Aprende a cargar, explorar, limpiar y manipular conjuntos de datos biológicos utilizando DataFrames de Pandas, la herramienta esencial para cualquier científico de datos.
Pandas es la herramienta más importante en el ecosistema de Python para la ciencia de datos. Su estructura de datos principal, el DataFrame, es una tabla bidimensional en memoria (similar a una hoja de cálculo o una tabla de base de datos) con filas y columnas etiquetadas. Permite cargar, limpiar, transformar, fusionar y analizar datos tabulares de manera intuitiva y potente.
En cualquier análisis, desde la genética hasta la fitopatología, los datos suelen presentarse en tablas. Un DataFrame de Pandas es la representación perfecta para estos datos, permitiéndonos, por ejemplo, tener una fila por cada planta y columnas que describan sus características (altura, número de hojas, presencia de enfermedad, genotipo, etc.). Es el punto de partida para casi cualquier análisis.
# Nota: Este código está listo para ser copiado y ejecutado en un notebook de Google Colab.
# Importamos la biblioteca pandas y, por convención, le damos el alias 'pd'.
# Esto hace el código más estándar y fácil de leer para otros científicos de datos.
import pandas as pd
# Creamos los datos usando un diccionario de Python.
# Las claves del diccionario se convertirán en los nombres de las columnas del DataFrame.
# Los valores (que son listas) se convertirán en las filas de esas columnas.
datos_plantas = {
'ID_Planta': ['Planta_1', 'Planta_2', 'Planta_3', 'Planta_4'],
'Especie': ['Tomate', 'Tomate', 'Pimiento', 'Pimiento'],
'Altura_cm': [120, 150, 80, 95],
'Tiene_Tizon': [True, False, False, True] # Tizón tardío, una enfermedad fúngica.
}
# Creamos un DataFrame a partir del diccionario usando el constructor pd.DataFrame().
df_plantas = pd.DataFrame(datos_plantas)
# Imprimir el DataFrame en la consola (o en una celda de Colab) lo muestra
# en un formato de tabla claro y legible, con índices de fila automáticos.
print(df_plantas)
# >> Salida:
# ID_Planta Especie Altura_cm Tiene_Tizon
# 0 Planta_1 Tomate 120 True
# 1 Planta_2 Tomate 150 False
# 2 Planta_3 Pimiento 80 False
# 3 Planta_4 Pimiento 95 True
Un primer paso crucial en cualquier proyecto es la captura de datos (ingesta). Rara vez escribirás los datos a mano; lo más común es cargarlos desde un archivo. Pandas sobresale en esto, pudiendo leer datos de una multitud de formatos como CSV, Excel, JSON, Parquet y bases de datos SQL con una sola función.
Una vez que los datos están cargados en un DataFrame, comienza la exploración de datos (EDA). Antes de cualquier análisis complejo, debemos "entender nuestros datos". Pandas ofrece funciones sencillas para una primera inspección:
.head(): Para ver las primeras filas y tener una idea de la estructura..info(): Para un resumen técnico: tipos de datos por columna y si hay valores faltantes (nulos). ¡Esto es clave para la limpieza de datos!.describe(): Para obtener un resumen estadístico rápido (media, desviación estándar, cuartiles, etc.) de las columnas numéricas.
# Nota: Este código está listo para ser copiado y ejecutado en un notebook de Google Colab.
# Importamos las bibliotecas necesarias.
import pandas as pd
# 'io' nos permite simular un archivo en la memoria para este ejemplo,
# así no necesitamos un archivo físico para demostrar la funcionalidad.
import io
# Simulamos un archivo CSV. En un proyecto real, esta sería la ruta a tu archivo,
# por ejemplo: 'datos_fitopatologia.csv'.
# El formato CSV (Valores Separados por Comas) es un estándar para datos tabulares.
csv_data = """ID_Muestra,Tipo_Patogeno,Nivel_Infeccion,Tratamiento,Fecha
M1,Hongo,7.8,Control,2023-05-10
M2,Hongo,4.5,TratA,2023-05-10
M3,Bacteria,8.9,Control,2023-05-11
M4,Hongo,3.2,TratA,2023-05-11
M5,Bacteria,9.5,TratA,2023-05-12
M6,Virus,,Control,2023-05-12
"""
# Usamos la función pd.read_csv() para leer los datos del CSV a un DataFrame.
# io.StringIO() convierte nuestra cadena de texto en un objeto similar a un archivo.
# En un caso real: df_infeccion = pd.read_csv('ruta/a/tu/archivo.csv')
df_infeccion = pd.read_csv(io.StringIO(csv_data))
# 1. .head() es la primera herramienta que usamos para verificar que los datos se cargaron bien.
# Muestra las primeras 5 filas por defecto.
print("--- 1. Primeras filas del DataFrame (.head()): ---")
print(df_infeccion.head())
# >> Salida:
# --- 1. Primeras filas del DataFrame (.head()): ---
# ID_Muestra Tipo_Patogeno Nivel_Infeccion Tratamiento Fecha
# 0 M1 Hongo 7.8 Control 2023-05-10
# 1 M2 Hongo 4.5 TratA 2023-05-10
# 2 M3 Bacteria 8.9 Control 2023-05-11
# 3 M4 Hongo 3.2 TratA 2023-05-11
# 4 M5 Bacteria 9.5 TratA 2023-05-12
# 2. .info() nos da un resumen técnico. Crucial para detectar datos faltantes.
# Observa que 'Nivel_Infeccion' tiene solo 5 valores no nulos, pero hay 6 entradas. ¡Tenemos un dato faltante!
print("\n--- 2. Información del DataFrame (.info()): ---")
df_infeccion.info()
# >> Salida:
# --- 2. Información del DataFrame (.info()): ---
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 6 entries, 0 to 5
# Data columns (total 5 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 ID_Muestra 6 non-null object
# 1 Tipo_Patogeno 6 non-null object
# 2 Nivel_Infeccion 5 non-null float64
# 3 Tratamiento 6 non-null object
# 4 Fecha 6 non-null object
# dtypes: float64(1), object(4)
# memory usage: 416.0+ bytes
# 3. .describe() calcula estadísticas descriptivas para las columnas numéricas.
# Nos da una idea rápida de la distribución de nuestros datos numéricos.
print("\n--- 3. Resumen Estadístico (.describe()): ---")
print(df_infeccion.describe())
# >> Salida:
# --- 3. Resumen Estadístico (.describe()): ---
# Nivel_Infeccion
# count 5.000000
# mean 6.780000
# std 2.774347
# min 3.200000
# 25% 4.500000
# 50% 7.800000
# 75% 8.900000
# max 9.500000