Pandas: Lectura y escritura de datos

Pandas proporciona un amplio conjunto de funciones para leer y escribir en diversos formatos de datos. Además de los comunes CSV y Excel, también admite bases de datos SQL, tablas HTML, Parquet, entre otros formatos. Esta sección introduce estas funcionalidades adicionales de E/S para ayudarte a gestionar de forma flexible la importación y exportación de datos en diferentes escenarios.


Descripción general de las funciones principales de E/S

Las funciones de E/S de Pandas son muy potentes y admiten operaciones de lectura y escritura en múltiples formatos de datos. A continuación se presentan las funciones de lectura y escritura más utilizadas:

Funciones de lectura Funciones de escritura Formatos compatibles Escenarios típicos
pd.read_csv() to_csv() CSV、TSV Archivos de registro, datos tabulares
pd.read_excel() to_excel() Excel(.xlsx, .xls) Informes de negocio, datos financieros
pd.read_sql() to_sql() Base de datos SQL Interacción con bases de datos empresariales
pd.read_html() - Tablas HTML Extracción de datos web
pd.read_parquet() to_parquet() Apache Parquet Análisis y almacenamiento de macrodatos
pd.read_feather() to_feather() Formato Feather Lectura/escritura rápida, datos en memoria
pd.read_json() to_json() JSON Datos de API, servicios web
pd.read_pickle() to_pickle() Python pickle Serialización de objetos de Python

Los diferentes formatos tienen distintos casos de uso adecuados. CSV es un formato universal, pero los archivos son grandes; Parquet es de almacenamiento columnar, adecuado para análisis de big data; Excel es apropiado para inspección manual, pero no para grandes volúmenes de datos.


CSV y archivos de texto

CSV (valores separados por comas) es el formato de intercambio de datos más universal, y Pandas ofrece el soporte más completo para él.

Parámetros de lectura comunes

Ejemplo

import pandas as pd

# Lectura más básica
df = pd.read_csv("data.csv")

# Especificar el delimitador (por defecto CSV usa coma, TSV usa tabulador)
df_tsv = pd.read_csv("data.tsv", sep="\t")

# Especificar la codificación (común al procesar archivos en chino)
df_utf8 = pd.read_csv("data.csv", encoding="utf-8")
df_gbk = pd.read_csv("data.csv", encoding="gbk")

# Saltar filas (saltar filas después del encabezado o líneas de comentario)
df = pd.read_csv("data.csv", skiprows=3)  # Saltar las primeras 3 filas
df = pd.read_csv("data.csv", skiprows=[2, 4])  # Saltar las filas 2 y 4

# Usar la fila de encabezado (por defecto la primera fila)
df = pd.read_csv("data.csv", header=0)  # La fila 0 como encabezado
df = pd.read_csv("data.csv", header=None)  # Sin encabezado, generar automáticamente 0,1,2...

# Especificar nombres de columnas
df = pd.read_csv("data.csv", names=["ID", "Nombre", "Edad", "Ciudad"])

# Especificar la columna de índice
df = pd.read_csv("data.csv", index_col=0)  # La columna 0 como índice
df = pd.read_csv("data.csv", index_col=["Nombre"])  # Varias columnas como índice compuesto

Manejo de valores faltantes

Ejemplo

import pandas as pd
import numpy as np

# Especificar qué valores se consideran valores faltantes
df = pd.read_csv(
    "data.csv",
    na_values=["NA", "null", "NULL", "N/A", "", " "]  # Estos valores se reconocerán como NaN
)

# Diferentes columnas pueden usar distintos marcadores de valores faltantes
df = pd.read_csv(
    "data.csv",
    na_values={
        "Edad": ["Desconocido", "0"],  # Valor faltante para la columna 'Edad'
        "Ciudad": ["Desconocido"]        # Valor faltante para la columna 'Ciudad'
    }
)

# Conservar algunos valores como normales (que no se reconozcan como faltantes)
df = pd.read_csv("data.csv", keep_default_na=False)

Escritura de archivos CSV

Ejemplo

import pandas as pd

# Preparar datos de prueba
df = pd.DataFrame({
    "Nombre": ["Zhang San", "Li Si", "Wang Wu"],
    "Edad": [25, 30, 28],
    "Ciudad": ["Beijing", "Shanghai", "Guangzhou"]
})

# Escribir CSV (con índice por defecto)
df.to_csv("output.csv")

# No escribir el índice
df.to_csv("output.csv", index=False)

# Especificar el delimitador
df.to_csv("output.csv", sep="\t")

# No escribir el encabezado
df.to_csv("output.csv", header=False)

# Especificar la codificación
df.to_csv("output.csv", encoding="utf-8-sig")  # Con BOM, adecuado para abrir en Excel

Archivos JSON

JSON (Notación de Objetos JavaScript) es el formato de datos más común en aplicaciones web. Pandas ofrece funciones flexibles de lectura y escritura.

Estructura JSON y métodos de lectura

La estructura de datos JSON puede adoptar diversas formas; al leer, es necesario elegir los parámetros adecuados según la estructura real:

Ejemplo

import pandas as pd
import json

# Preparar datos JSON de prueba
data_records = '''
[
{"name": "Zhang San", "age": 25, "city": "Beijing"},
{"name": "Li Si", "age": 30, "city": "Shanghai"},
{"name": "Wang Wu", "age": 28, "city": "Guangzhou"}
]
'''


# Método 1: Array JSON (un objeto por línea) -> DataFrame
df = pd.read_json(data_records, orient="records")
print("orient='records':")
print(df)
print()

# Método 2: Objeto JSON (pares clave-valor) -> Series
data_dict = '{"name": "Zhang San", "age": 25, "city": "Beijing"}'
s = pd.read_json(data_dict, typ="series")
print(Leído como Series:)
print(s)

Formato JSON Lines

JSON Lines (.jsonl) es un formato en el que cada línea contiene un objeto JSON completo; se usa a menudo en registros y escenarios de big data:

Ejemplo

import pandas as pd

# Datos en formato JSON Lines
jsonl_data = '''{"name": "Zhang San", "age": 25}
{"name": "Li Si", "age": 30}
{"name": "Wang Wu", "age": 28}
{"name": "Zhao Liu", "age": 35}
'''


# Escribir archivo JSON Lines
with open("data.jsonl", "w", encoding="utf-8") as f:
    f.write(jsonl_data)

# Leer JSON Lines (cada línea es un objeto JSON)
df = pd.read_json("data.jsonl", lines=True)
print(df)

Escritura de JSON

Ejemplo

import pandas as pd

df = pd.DataFrame({
    "Nombre": ["Zhang San", "Li Si", "Wang Wu"],
    "Edad": [25, 30, 28],
    "Ciudad": ["Beijing", "Shanghai", "Guangzhou"]
})

# Escribir JSON con distintos valores de 'orient'
df.to_json("output_records.json", orient="records", force_ascii=False, indent=2)
df.to_json("output_index.json", orient="index", force_ascii=False, indent=2)
df.to_json("output_columns.json", orient="columns", force_ascii=False, indent=2)

# Formato JSON Lines
df.to_json("output.jsonl", orient="records", lines=True, force_ascii=False)

Serialización con Pickle

Pickle es el formato de serialización de objetos nativo de Python; puede guardar cualquier objeto de Python, incluidos DataFrames y estructuras anidadas complejas.

Ejemplo

import pandas as pd
import pickle

# Crear un DataFrame de estructura compleja
df = pd.DataFrame({
    "A": range(10),
    "B": range(10, 20),
    "C": ["foo", "bar"] * 5
})

# Escribir archivo Pickle
df.to_pickle("data.pkl")

# Leer archivo Pickle
df_loaded = pd.read_pickle("data.pkl")
print(df_loaded)

# Escritura comprimida (compresión gzip, archivo más pequeño)
df.to_pickle("data.pkl.gz", compression="gzip")
df_loaded = pd.read_pickle("data.pkl.gz", compression="gzip")

El formato Pickle solo puede ser leído por Python, por lo que no es adecuado para el intercambio de datos entre lenguajes. Además, cargar archivos Pickle de fuentes no confiables implica riesgos de seguridad; no cargues archivos .pkl de origen desconocido.


Rendimiento y selección de escenarios

Los distintos formatos de datos tienen diferentes características de rendimiento; elegir el formato adecuado puede mejorar considerablemente la eficiencia:

Formato Velocidad de lectura Velocidad de escritura Tamaño del archivo Escenario de uso
CSV Lento Medio grande Formato de intercambio universal, legible por humanos
Parquet Muy rápida Rápido Muy pequeño Análisis de big data, consultas por columnas
Feather Extremadamente rápida Extremadamente rápida grande Transferencia rápida de datos en memoria
Pickle Rápido Rápido Medio Persistencia de objetos de Python
JSON Lento Medio Muy grande API web, entre lenguajes

Problemas comunes y precauciones

1. Memoria insuficiente al leer archivos grandes

Para archivos CSV o JSON muy grandes, se puede usarchunksizeel parámetro de lectura por bloques, evitando cargar todo en memoria de una vez.

2. Problemas de codificación de caracteres chinos

Al procesar archivos en chino, asegúrate de especificar la codificación correcta. Las codificaciones comunes incluyen utf-8, gbk, gb2312, utf-8-sig (BOM), entre otras.

3. Archivo dañado tras la escritura

Antes de escribir datos importantes, se recomienda leer y verificar primero. Al escribir archivos grandes, usar formato comprimido puede reducir la E/S del disco y disminuir el riesgo de corrupción de datos.

4. Limitaciones del formato Excel

La versión Excel 2003 (.xls) admite un máximo de 65536 filas por hoja, y la versión 2007 (.xlsx) admite un máximo de 1048576 filas. Si supera el límite, considere otros formatos.

Otras extensiones