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.

Cargando DataFrame de pandas desde archivos parquet: las listas se deserializan como ndarrays de numpy.

import pandas as pd
df = pd.DataFrame({
    "col1" : ["a", "b", "c"],
    "col2" : [[1,2,3], [4,5,6,7], [8,9,10,11,12]]
})
df.to_parquet("./df_as_pq.parquet")
df = pd.read_parquet("./df_as_pq.parquet")
[type(val) for val in df["col2"].tolist()]

Salida:

[<class 'numpy.ndarray'="">, <class 'numpy.ndarray'="">, <class 'numpy.ndarray'="">]

¿Existe alguna forma en la que pueda leer el archivo parquet y obtener los valores de la lista como listas de Python (como en la creación)?
Preferiblemente utilizando pandas, pero dispuesto a probar alternativas.

El problema al que me enfrento es que no tengo conocimiento previo sobre qué columnas contienen listas, por lo que verifico los tipos de manera similar a lo que hago en el código. Suponiendo que no estoy interesado en agregar numpy actualmente como una dependencia, ¿hay alguna forma de verificar si una variable es similar a una matriz sin importar y especificar explícitamente np.ndarray?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de leer un archivo Parquet y obtener los valores de lista como listas en Python usando pandas. Puedes usar el motor fastparquet en lugar del motor predeterminado pyarrow para leer el archivo Parquet. El motor fastparquet puede conservar los tipos de lista y diccionario originales.

    Aquí hay un ejemplo:

    import pandas as pd
    
    df = pd.DataFrame({
        "col1" : ["a", "b", "c"],
        "col2" : [[1,2,3], [4,5,6,7], [8,9,10,11,12]]
    })
    df.to_parquet("./df_as_pq.parquet")
    df = pd.read_parquet("./df_as_pq.parquet", engine="fastparquet")
    print(df)
    
    # Salida:
    #   col1                 col2
    # 0    a            [1, 2, 3]
    # 1    b        [4, 5, 6, 7]
    # 2    c  [8, 9, 10, 11, 12]
    
    print([type(val) for val in df["col2"].tolist()])
    
    # Salida:
    # [<class 'list'="">, <class 'list'="">, <class 'list'="">]
    

    En cuanto a verificar si una variable se parece a una matriz sin importar explícitamente y especificar np.ndarray, puedes usar la función isinstance y verificar la clase base abstracta collections.abc.Sequence. Aquí tienes un ejemplo:

    import collections.abc
    
    my_list = [1, 2, 3]
    es_similar_a_array = isinstance(my_list, collections.abc.Sequence)
    print(es_similar_a_array)
    
    # Salida:
    # True
    

    De esta manera, puedes verificar si una variable se parece a una matriz sin importar numpy y especificar np.ndarray.

Comments are closed.