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?
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:
Luego, al crear el conjunto de datos, puedes pasar el parámetro
esquema
a la funciónds.dataset
: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: