6 - Operaciones con CSV en Python (detalle con Pandas)

La biblioteca pandas es una herramienta indispensable en Python para el análisis y manipulación de datos tabulares, incluyendo archivos CSV. Ofrece una gran flexibilidad y eficiencia para realizar diversas operaciones.

Para los ejemplos, asumiremos que tenemos un archivo productos.csv con el siguiente contenido:

ID,Nombre,Categoría,Precio,Stock
1,Laptop,Electrónica,1200.50,10
2,Teclado,Electrónica,75.00,25
3,Mouse,Electrónica,25.99,50
4,Monitor,Electrónica,300.00,15
5,Mesa,Muebles,150.00,5
6,Silla,Muebles,80.00,20

Lectura con pandas.read_csv()

La función read_csv() es la puerta de entrada para cargar datos CSV en un DataFrame de pandas. Es muy potente y configurable.

import pandas as pd

# Lectura básica
df = pd.read_csv('productos.csv')
print("DataFrame completo:\n", df)

# Especificando delimitador (si no es coma)
df_semicolon = pd.read_csv('productos_semicolon.csv', sep=';')

# Especificando codificación
df_latin1 = pd.read_csv('productos_latin1.csv', encoding='latin1')

# Seleccionar solo algunas columnas al leer
df_subset = pd.read_csv('productos.csv', usecols=['Nombre', 'Precio'])
print("\nDataFrame con columnas seleccionadas:\n", df_subset)

# Leer sin encabezado (si el archivo no tiene)
df_no_header = pd.read_csv('productos_no_header.csv', header=None, names=['Col1', 'Col2', 'Col3'])
print("\nDataFrame sin encabezado:\n", df_no_header)

Filtrado y selección de columnas

Una vez que los datos están en un DataFrame, pandas facilita enormemente la selección de columnas y el filtrado de filas.

# Seleccionar una sola columna
nombres = df['Nombre']
print("\nNombres de productos:\n", nombres)

# Seleccionar múltiples columnas
productos_precios = df[['Nombre', 'Precio']]
print("\nNombres y precios:\n", productos_precios)

# Filtrar filas por una condición (productos con precio > 100)
productos_caros = df[df['Precio'] > 100]
print("\nProductos caros:\n", productos_caros)

# Filtrar por múltiples condiciones (categoría Electrónica y stock < 20)
electronica_bajo_stock = df[(df['Categoría'] == 'Electrónica') & (df['Stock'] < 20)]
print("\nElectrónica con bajo stock:\n", electronica_bajo_stock)

# Filtrar usando .loc (selección por etiqueta)
fila_id_2 = df.loc[df['ID'] == 2]
print("\nFila con ID 2:\n", fila_id_2)

# Filtrar usando .iloc (selección por posición entera)
primera_fila = df.iloc[0]
print("\nPrimera fila:\n", primera_fila)

Agregar y modificar registros

Pandas permite agregar nuevas filas y modificar valores existentes de manera intuitiva.

# Modificar un valor específico (cambiar el precio del Mouse)
df.loc[df['Nombre'] == 'Mouse', 'Precio'] = 29.99
print("\nDataFrame con precio de Mouse modificado:\n", df)

# Modificar múltiples valores (aumentar stock de Electrónica en 5)
df.loc[df['Categoría'] == 'Electrónica', 'Stock'] += 5
print("\nDataFrame con stock de Electrónica aumentado:\n", df)

# Agregar una nueva columna (ej. 'ValorTotal')
df['ValorTotal'] = df['Precio'] * df['Stock']
print("\nDataFrame con columna 'ValorTotal':\n", df)

# Agregar una nueva fila (usando pd.concat)
nuevo_producto = pd.DataFrame([{'ID': 7, 'Nombre': 'Cama', 'Categoría': 'Muebles', 'Precio': 400.00, 'Stock': 8}])
df = pd.concat([df, nuevo_producto], ignore_index=True)
print("\nDataFrame con nueva fila:\n", df)

Guardar con to_csv()

Una vez que has manipulado los datos, puedes guardarlos de nuevo en un archivo CSV usando la función to_csv().

# Guardar el DataFrame modificado a un nuevo archivo CSV
df.to_csv('productos_actualizados.csv', index=False, encoding='utf-8')
print("\nDataFrame guardado en productos_actualizados.csv")

# Guardar con un delimitador diferente
df.to_csv('productos_semicolon_out.csv', sep=';', index=False, encoding='utf-8')

# Guardar solo algunas columnas
df[['Nombre', 'ValorTotal']].to_csv('reporte_valor_total.csv', index=False, encoding='utf-8')

Explicación:

  • index=False: Es muy importante para evitar que pandas escriba el índice del DataFrame como una columna adicional en el CSV.
  • encoding='utf-8': Asegura que el archivo se guarde con la codificación correcta.
  • Puedes especificar el delimitador con el parámetro sep.