BioData Insights

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: La Navaja Suiza para la Manipulación 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
Captura y Exploración Inicial de Datos desde Archivos

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