Ho dei dati salvati in un database postgreSQL. Sto interrogando questi dati usando Python2.7 e trasformandoli in un Pandas DataFrame. Tuttavia, l'ultima colonna di questo frame di dati contiene un dizionario (o un elenco?) Di valori al suo interno. DataFrame è simile al seguente:
[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"}
Ho bisogno di dividere questa colonna in colonne separate in modo che DataFrame assomigli a questo:
[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
Il problema principale che sto riscontrando è che le liste non hanno le stesse lunghezze. Ma tutte le liste contengono solo gli stessi 3 valori: a, b e c. E appaiono sempre nello stesso ordine (un primo, b secondo, c terzo).
Il seguente codice USATO per funzionare e restituire esattamente quello che volevo (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)
Stavo eseguendo questo codice solo la scorsa settimana e funzionava bene. Ma ora il mio codice è rotto e ottengo questo errore dalla riga [4]:
IndexError: out-of-bounds on slice (end)
Non ho apportato modifiche al codice ma ora ricevo l'errore. Ritengo che ciò sia dovuto al fatto che il mio metodo non è solido o adeguato.
Eventuali suggerimenti o indicazioni su come dividere questa colonna di elenchi in colonne separate sarebbero molto apprezzati!
EDIT: Penso che i metodi .tolist () e .apply non funzionano sul mio codice perché è una stringa unicode, cioè:
#My data format
u{'a': '1', 'b': '2', 'c': '3'}
#and not
{u'a': '1', u'b': '2', u'c': '3'}
I dati vengono importati dal database postgreSQL in questo formato. Qualche aiuto o idee con questo problema? c'è un modo per convertire l'unicode?
iloc[:, :3]
presuppone che ci saranno 3 elementi, e forse le sezioni di dati più recenti hanno solo 1 o 2 (ad esempio, non ci sono b
come in index 8813
)?
iloc
parte