Tenho dados salvos em um banco de dados postgreSQL. Estou consultando esses dados usando Python2.7 e transformando-os em um DataFrame do Pandas. No entanto, a última coluna desse quadro de dados possui um dicionário (ou lista?) De valores. O DataFrame fica assim:
[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"}
Eu preciso dividir esta coluna em colunas separadas para que o DataFrame fique assim:
[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
O principal problema que estou enfrentando é que as listas não são do mesmo tamanho. Mas todas as listas contêm apenas os mesmos três valores: a, bec. E eles sempre aparecem na mesma ordem (um primeiro, b segundo, c terceiro).
O código a seguir USADO para trabalhar e retornar exatamente o que eu queria (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)
Eu estava executando esse código apenas na semana passada e estava funcionando bem. Mas agora meu código está quebrado e recebo esse erro da linha [4]:
IndexError: out-of-bounds on slice (end)
Não fiz alterações no código, mas agora estou recebendo o erro. Sinto que isso se deve ao fato de meu método não ser robusto ou adequado.
Qualquer sugestão ou orientação sobre como dividir esta coluna de listas em colunas separadas seria super apreciada!
EDIT: Eu acho que os métodos .tolist () e .apply não estão funcionando no meu código porque é uma string unicode, ou seja:
#My data format
u{'a': '1', 'b': '2', 'c': '3'}
#and not
{u'a': '1', u'b': '2', u'c': '3'}
Os dados estão sendo importados do banco de dados postgreSQL neste formato. Alguma ajuda ou idéias para esse problema? existe uma maneira de converter o unicode?
iloc[:, :3]
pressupõe que haverá 3 itens e talvez as fatias de dados mais recentes tenham apenas 1 ou 2 (por exemplo, por exemplo, não há b
como index 8813
).
iloc
parte