Solución:
Como señaló, esto puede suceder comúnmente al guardar y cargar pandas DataFrames como .csv
archivos, que es un formato de texto.
En su caso, esto sucedió porque los objetos de la lista tienen una representación de cadena, lo que les permite almacenarse como .csv
archivos. Cargando el .csv
luego producirá esa representación de cadena.
Si desea almacenar los objetos reales, debe usar DataFrame.to_pickle()
(nota: ¡los objetos deben ser decapables!).
Para responder a su segunda pregunta, puede volver a convertirla con ast.literal_eval
:
>>> from ast import literal_eval
>>> literal_eval('[1.23, 2.34]')
[1.23, 2.34]
Puedes usar pandas directamente –
df = pd.read_csv(df_name, converters={'column_name': eval})
Esto leerá esa columna como su correspondiente tipo d en python en lugar de una cadena.
Me acabo de encontrar con este problema y hay una solución muy simple (pandas.eval ()). Estoy usando pandas 0.20.0.
# SETUP
import pandas as pd
import io
csv = io.StringIO(u'''
id list
A1 [1,2]
A2 [3,4]
A3 [5,6]
''')
df = pd.read_csv(csv, delim_whitespace = True)
# TYPE CHECK <type 'str'>
print type(df.at[0, 'list'])
# MAIN CONVERSION
df['list'] = pd.eval(df['list'])
# TYPE CHECK <type 'list'>
print type(df.at[0, 'list'])