Tengo datos guardados en una base de datos postgreSQL. Estoy consultando estos datos usando Python2.7 y convirtiéndolos en un Pandas DataFrame. Sin embargo, la última columna de este marco de datos tiene un diccionario (¿o una lista?) De valores dentro de él. El DataFrame se ve así:
[1] df
Station ID Pollutants
8809 {"a": "46", "b": "3", "c": "12"}
8810 {"a": "36", "b": "5", "c": "8"}
8811 {"b": "2", "c": "7"}
8812 {"c": "11"}
8813 {"a": "82", "c": "15"}
Necesito dividir esta columna en columnas separadas para que el DataFrame se vea así:
[2] df2
Station ID a b c
8809 46 3 12
8810 36 5 8
8811 NaN 2 7
8812 NaN NaN 11
8813 82 NaN 15
El principal problema que tengo es que las listas no tienen la misma longitud. Pero todas las listas solo contienen hasta los mismos 3 valores: a, b y c. Y siempre aparecen en el mismo orden (a primero, b segundo, c tercero).
El siguiente código UTILIZADO para funcionar y devolver exactamente lo que quería (df2).
[3] df
[4] objs = [df, pandas.DataFrame(df['Pollutant Levels'].tolist()).iloc[:, :3]]
[5] df2 = pandas.concat(objs, axis=1).drop('Pollutant Levels', axis=1)
[6] print(df2)
Estaba ejecutando este código la semana pasada y estaba funcionando bien. Pero ahora mi código está roto y recibo este error de la línea [4]:
IndexError: out-of-bounds on slice (end)
No hice cambios en el código, pero ahora recibo el error. Siento que esto se debe a que mi método no es robusto o adecuado.
Cualquier sugerencia u orientación sobre cómo dividir esta columna de listas en columnas separadas sería muy apreciada.
EDITAR: Creo que los métodos .tolist () y .apply no funcionan en mi código porque es una cadena unicode, es decir:
#My data format
u{'a': '1', 'b': '2', 'c': '3'}
#and not
{u'a': '1', u'b': '2', u'c': '3'}
Los datos se importan desde la base de datos postgreSQL en este formato. ¿Alguna ayuda o ideas con este problema? ¿Hay alguna manera de convertir el Unicode?
iloc[:, :3]
supone que habrá 3 elementos, y tal vez los segmentos de datos más recientes solo tengan 1 o 2 (por ejemplo, no hay nada b
parecido index 8813
)?
iloc
parte