¿Cómo leer una columna de csv como lista de tipos usando pandas?

3 minutos de lectura

avatar de usuario
nachiappanpl

Tengo un archivo csv con 3 columnas, en el que cada fila de la Columna 3 tiene una lista de valores. Como puede ver en la siguiente estructura de la tabla

Col1,Col2,Col3
1,a1,"['Proj1', 'Proj2']"
2,a2,"['Proj3', 'Proj2']"
3,a3,"['Proj4', 'Proj1']"
4,a4,"['Proj3', 'Proj4']"
5,a5,"['Proj5', 'Proj2']"

Cada vez que trato de leer este csv, Col3 se lee como un objeto str y no como una lista. Traté de modificar el tipo de esa columna para que aparezca en la lista, pero obtuve “Error de atributo” como se muestra a continuación

df = pd.read_csv("inputfile.csv")
df.Col3.dtype = list

AttributeError                            Traceback (most recent call last)
<ipython-input-19-6f9ec76b1b30> in <module>()
----> 1 df.Col3.dtype = list

C:\Python27\lib\site-packages\pandas\core\generic.pyc in __setattr__(self,         name, value)
   1953                     object.__setattr__(self, name, value)
   1954             except (AttributeError, TypeError):
-> 1955                 object.__setattr__(self, name, value)
   1956 
   1957     #----------------------------------------------------------------------

AttributeError: no se puede establecer el atributo

Sería muy bueno si me puede orientar sobre cómo hacerlo.

  • ¿Puede mostrarnos un ejemplo de su csv (no como una imagen), copie y pegue las primeras filas de su csv?

    – Anand S. Kumar

    23 de septiembre de 2015 a las 15:04

  • Advertencia estándar: los valores no escalares no son realmente compatibles con pandas. Puede usarlos, ya que a veces son útiles en pasos intermedios, pero trabajar con ellos es un inconveniente y eso no va a cambiar en el futuro cercano.

    – DSM

    23 de septiembre de 2015 a las 15:07


  • ¿Qué quieres hacer con los valores?

    – Padraic Cunningham

    23 de septiembre de 2015 a las 15:07

  • @AnandSKumar Copiar valores pegados de mi csv

    – nachiappanpl

    23 de septiembre de 2015 a las 15:13

  • @PadraicCunningham No, el valor final será una cadena. Ilustración de muestra de PFB de mi requisito Fila de entrada: 1, a1,”[‘Proj1’, ‘Proj2’]” Filas de salida: 1,a1,”Proj1″ 1,a1,”Proy2″

    – nachiappanpl

    24 de septiembre de 2015 a las 9:07


Agregando un reemplazo a la respuesta de Cunninghams:

df = pd.read_csv("in.csv",converters={"Col3": lambda x: x.strip("[]").replace("'","").split(", ")})

Ver también pandas – convertir cadena en lista de cadenas

  • Esta es una buena solución pero no maneja cadenas vacías, la lambda da [''] para entrada []

    – Epimeteo

    16 de julio de 2020 a las 21:09


Si tiene la opción de escribir el archivo –

puedes usar pd.to_parquet y pd.read_parquet (en lugar de csv).

Analizará correctamente esta columna.

  • Esto es excelente. Esto me salvó de muchas otras formas no elegantes de guardar y leer marcos de datos con tales columnas.

    – usuario3480922

    13 de julio de 2021 a las 12:52

avatar de usuario
ricardo

Tengo un enfoque diferente para esto, que se puede usar para representaciones de cadenas de otros tipos de datos, además de solo listas.

Puede usar la biblioteca json y aplicar json.loads() a la columna deseada. p.ej

import json
df.my_column = df.my_column.apply(json.loads)

Sin embargo, para que esto funcione, las cadenas de entrada deben estar entre comillas dobles.

  • Esto es excelente. Esto me salvó de muchas otras formas no elegantes de guardar y leer marcos de datos con tales columnas.

    – usuario3480922

    13 de julio de 2021 a las 12:52

avatar de usuario
mate525252

Otra solución para columnas tipo matriz en su csv:

df = pd.read_csv("inputfile.csv")
df["Col3"] = df["Col3"].fillna("[]").apply(lambda x: eval(x))

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad