Trabajar con datos CSV a menudo implica lidiar con imperfecciones. La validación y limpieza son pasos cruciales para asegurar la calidad de los datos antes de su análisis o importación a sistemas.
Los datos en archivos CSV rara vez son perfectos. Pueden contener errores de entrada, inconsistencias, duplicados o formatos incorrectos. La limpieza de datos es el proceso de corregir o eliminar estos errores.
NA
, NULL
). Se pueden rellenar con un valor por defecto, la media/mediana, o eliminar la fila/columna.
import pandas as pd
df = pd.read_csv('datos_sucios.csv')
print("Valores nulos antes:\n", df.isnull().sum())
# Rellenar nulos en la columna 'Edad' con la media
df['Edad'].fillna(df['Edad'].mean(), inplace=True)
# Eliminar filas con cualquier valor nulo
df.dropna(inplace=True)
print("Valores nulos después:\n", df.isnull().sum())
# Convertir columna a tipo numérico, forzando errores a NaN
df['Precio'] = pd.to_numeric(df['Precio'], errors='coerce')
# Eliminar filas donde la conversión falló
df.dropna(subset=['Precio'], inplace=True)
df['Nombre'] = df['Nombre'].str.strip()
Asegurarse de que los valores en una columna sigan un patrón o un conjunto de valores permitidos.
print("Categorías únicas:\n", df['Categoría'].unique())
# Corregir inconsistencias (ej. 'Electronica' y 'electrónica')
df['Categoría'] = df['Categoría'].replace({'Electronica': 'Electrónica'})
Los registros duplicados pueden sesgar los análisis. Es importante identificarlos y decidir si eliminarlos o no.
print("Filas duplicadas antes:\n", df.duplicated().sum())
# Eliminar filas completamente duplicadas
df.drop_duplicates(inplace=True)
# Eliminar duplicados basándose en un subconjunto de columnas (ej. ID de producto)
df.drop_duplicates(subset=['ID'], inplace=True)
Transformar los datos a un formato estándar. Esto puede incluir:
Los archivos CSV son un formato muy común para interactuar con bases de datos, tanto para importar datos existentes como para exportar resultados de consultas.
La mayoría de los sistemas de bases de datos relacionales tienen comandos o herramientas para importar datos desde archivos CSV.
LOAD DATA INFILE
.
LOAD DATA INFILE '/path/to/data.csv'
INTO TABLE my_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS; -- Para ignorar la fila de encabezado
COPY
.
COPY my_table FROM '/path/to/data.csv' WITH (FORMAT CSV, HEADER TRUE);
.import
.
.mode csv
.import /path/to/data.csv my_table
to_sql()
para insertarlo en una base de datos (requiere una librería de conexión a la DB, ej. sqlalchemy
y psycopg2
para PostgreSQL).
from sqlalchemy import create_engine
# Conexión a PostgreSQL (ejemplo)
engine = create_engine('postgresql://user:password@host:port/database')
df = pd.read_csv('datos.csv')
# Escribir el DataFrame a una tabla en la base de datos
df.to_sql('nombre_tabla', engine, if_exists='replace', index=False)
De manera similar, puedes exportar datos de una tabla o el resultado de una consulta a un archivo CSV.
SELECT ... INTO OUTFILE
(ya visto en Tema 4).
COPY ... TO
(ya visto en Tema 4).
to_csv()
.
# Leer datos de una tabla de base de datos a un DataFrame
df_db = pd.read_sql('SELECT * FROM nombre_tabla', engine)
# Guardar el DataFrame a CSV
df_db.to_csv('export_db.csv', index=False, encoding='utf-8')
Los archivos CSV juegan un papel fundamental en los procesos ETL:
La simplicidad y el formato de texto plano de CSV lo hacen un formato de intercambio ideal en muchas etapas de un pipeline ETL.