alltools.one
Data
2025-07-01
8 min
alltools.one Team
CSVData CleaningData AnalysisETLPython

Consejos de Limpieza de Datos CSV para Analistas y Desarrolladores

Los archivos CSV son el formato universal de intercambio para datos tabulares. Son simples, legibles por humanos y compatibles con todas las herramientas, desde Excel hasta pandas. Pero los archivos CSV del mundo real a menudo están desordenados — codificaciones inconsistentes, valores faltantes, tipos de datos mixtos y filas malformadas. Esta guía cubre técnicas prácticas para limpiar datos CSV de forma confiable.

Problemas Comunes de CSV

1. Problemas de Codificación

El problema más frustrante de CSV es la codificación. Un archivo creado en Windows con Excel podría usar windows-1252, mientras que tu script de Python espera utf-8.

Síntomas: Caracteres ilegibles (mojibake) como é en lugar de é, o excepciones UnicodeDecodeError.

Detección:

import chardet

with open('data.csv', 'rb') as f:
    result = chardet.detect(f.read(10000))
    print(result)  # {'encoding': 'Windows-1252', 'confidence': 0.73}

Solución: Lee con la codificación detectada, luego guarda como UTF-8:

import pandas as pd

df = pd.read_csv('data.csv', encoding='windows-1252')
df.to_csv('data_clean.csv', encoding='utf-8', index=False)

2. Delimitadores Inconsistentes

No todos los "CSV" usan comas. Los archivos CSV europeos a menudo usan punto y coma porque las comas son separadores decimales en muchas configuraciones regionales europeas.

# Auto-detect delimiter
import csv

with open('data.csv', 'r') as f:
    dialect = csv.Sniffer().sniff(f.read(5000))
    print(f"Delimiter: {repr(dialect.delimiter)}")

Nuestro Editor CSV maneja la detección de delimitadores automáticamente — pega tus datos e identifica el formato.

3. Valores Faltantes

Los datos faltantes aparecen de muchas formas: celdas vacías, NA, N/A, null, -, o simplemente espacios en blanco.

# Standardize all missing value representations
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', '-', '', ' '])

# Check missing values per column
print(df.isnull().sum())

# Strategy 1: Drop rows with missing critical fields
df = df.dropna(subset=['email', 'name'])

# Strategy 2: Fill with defaults
df['country'] = df['country'].fillna('Unknown')

# Strategy 3: Forward fill (time series)
df['price'] = df['price'].ffill()

4. Filas Duplicadas

Los duplicados exactos son fáciles de encontrar. Los duplicados difusos (la misma persona con una ortografía ligeramente diferente del nombre) son más difíciles.

# Find exact duplicates
duplicates = df[df.duplicated(keep=False)]
print(f"Found {len(duplicates)} duplicate rows")

# Remove duplicates, keeping the first occurrence
df = df.drop_duplicates()

# Remove duplicates based on specific columns
df = df.drop_duplicates(subset=['email'], keep='last')

5. Formatos de Datos Inconsistentes

Fechas en formatos mixtos, números de teléfono con y sin códigos de país, capitalización inconsistente:

# Standardize dates
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)

# Standardize text fields
df['name'] = df['name'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()

# Standardize phone numbers (basic)
df['phone'] = df['phone'].str.replace(r'[^0-9+]', '', regex=True)

6. Problemas de Tipos de Datos

CSV almacena todo como texto. Los números con ceros iniciales, códigos postales y números de teléfono pueden perder su formato al ser analizados:

# Preserve leading zeros in zip codes
df = pd.read_csv('data.csv', dtype={'zip_code': str, 'phone': str})

# Convert currency strings to numbers
df['price'] = df['price'].str.replace('$', '').str.replace(',', '').astype(float)

Validación Después de la Limpieza

Siempre valida tus datos limpios:

# Check row count (did we lose or gain rows unexpectedly?)
print(f"Rows: {len(df)}")

# Check data types
print(df.dtypes)

# Check value ranges
print(df.describe())

# Check for remaining nulls
print(df.isnull().sum())

# Validate unique constraints
assert df['email'].is_unique, "Duplicate emails found!"

Herramientas de Línea de Comandos

Para una limpieza rápida sin escribir código:

# Convert encoding
iconv -f WINDOWS-1252 -t UTF-8 input.csv > output.csv

# Sort and remove duplicate lines
sort -u input.csv > output.csv

# Extract specific columns (cut)
cut -d',' -f1,3,5 input.csv > output.csv

# Filter rows (awk)
awk -F',' '$3 > 100' input.csv > filtered.csv

Para transformaciones más complejas, herramientas como csvkit proporcionan un conjunto completo de utilidades CSV:

# Install
pip install csvkit

# View column names
csvcut -n data.csv

# Filter rows
csvgrep -c country -m "USA" data.csv > usa_only.csv

# Convert to JSON
csvjson data.csv > data.json

¿Convirtiendo entre CSV y JSON? Nuestro convertidor de CSV a JSON lo maneja al instante.

FAQ

¿Cuál es el tamaño máximo de archivo para el procesamiento de CSV?

No hay un límite inherente en el formato CSV. El límite práctico depende de tus herramientas: Excel maneja aproximadamente 1 millón de filas, pandas funciona bien hasta varios GB con RAM adecuada, y herramientas como Dask o Polars manejan conjuntos de datos más grandes que la memoria. Para herramientas basadas en navegador, nuestro editor CSV maneja archivos de hasta 100MB.

¿Debería usar CSV o JSON para el intercambio de datos?

CSV es mejor para datos planos y tabulares (hojas de cálculo, exportaciones de bases de datos, listas simples). JSON es mejor para datos anidados y jerárquicos (respuestas de API, configuración, documentos con estructura variable). Para una comparación detallada, consulta nuestra guía CSV vs JSON vs XML.

Recursos Relacionados

Published on 2025-07-01
CSV Data Cleaning Tips for Analysts and Developers | alltools.one