es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo corregir el archivo CSV con tipos mixtos si se está usando pyarrow para escribir el conjunto de datos en formato parquet?

Actualmente estoy utilizando pyarrow para leer un montón de archivos .csv desde un directorio en un conjunto de datos de la siguiente manera:

import pyarrow.dataset as ds

crear conjunto de datos a partir de archivos csv

dataset = ds.dataset(input_pat,
format=”csv”,
exclude_invalid_files = True)

Después de crear el conjunto de datos, lo escribo en formato parquet de la siguiente manera:

ds.write_dataset(dataset,
format = “parquet”,
base_dir = output_path,
basename_template = “nombre_datos_{i}.parquet”,
existing_data_behavior = “sobrescribir_o_ignorar”)

Ahora uso esto para dos conjuntos de datos, donde para el primer conjunto de datos funciona perfectamente bien. Para el segundo conjunto de datos estoy recibiendo un error:

ArrowInvalid: En la columna CSV #14: Fila #111060: Error de conversión de CSV a nulo: valor inválido ‘0’

Según entiendo, PyArrow no acepta valores enteros (“0”) en mis columnas de cadena. Ahora, si esta es la única violación, ¿hay alguna forma de corregirlo explícitamente al crear el conjunto de datos? Por ejemplo, me gustaría reemplazar “0” por “desconocido” al leerlo.

Esto sería muy útil, ya que no quiero corregir los errores en una función adicional previamente. Los datos se pueden encontrar aquí. No hay problemas con los taxis amarillos. El problema ocurre al leer los archivos csv de los taxis verdes.

¿Si defino el esquema, se solucionará el error? ¿Entenderá que debe tratar “0” como una cadena?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para corregir explícitamente el problema de los valores enteros en columnas de tipo cadena, puedes definir un esquema para el conjunto de datos utilizando la función pyarrow.schema y especificando los tipos de columna correspondientes. En este caso, puedes definir la columna con el valor entero como un tipo de cadena, lo que permitirá a PyArrow tratar el valor como una cadena en lugar de un entero.

    Por ejemplo, puedes definir el esquema de la siguiente manera:

    import pyarrow as pa
    
    # Define el esquema con la columna 14 como tipo de cadena
    esquema = pa.schema([
        ("col1", pa.string()),
        ("col2", pa.int64()),
        ...
        ("col14", pa.string()),
        ...
    ])
    

    Luego, al crear el conjunto de datos, puedes pasar el parámetro esquema a la función ds.dataset:

    # crear conjunto de datos a partir de archivos CSV con el esquema especificado
    conjunto_datos = ds.dataset(ruta_entrada,
                 format="csv",
                 exclude_invalid_files=True,
                 schema=esquema)
    

    Esto permitirá que PyArrow maneje correctamente los valores enteros en la columna de cadena tratándolos como cadenas en su lugar.

    Alternativamente, puedes definir una función personalizada para usarla como parámetro convert_options, que reemplace '0' con 'desconocido'. Aquí tienes un ejemplo:

    opts = ds.CsvReadOptions().block_size(2**20)
    convert_options = ds.CsvConvertOptions().with_before_function(
        lambda x: ['desconocido' if el == '0' else el for el in x]
    )
    esquema = ds.Schema.from_pandas(df=df)
    conjunto_datos = ds.dataset(
        ruta, format="csv", read_options=opts,
        convert_options=convert_options, schema=esquema
    )
    

Comments are closed.