Ho dati salvati in un database PostgreSQL. Sto interrogando questi dati usando Python2.7 e trasformandolo in un DataFrame di Pandas. Tuttavia, l'ultima colonna di questo dataframe ha un dizionario (o un elenco?) Di valori al suo interno. Il dataframe assomiglia a questo:Dizionario/elenco di suddivisione all'interno di una colonna di Pandas in colonne separate
[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 il dataframe assomiglia 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 avendo è che le liste non sono le stesse lunghezze Ma tutti gli elenchi contengono solo gli stessi 3 valori: a, b e c. E appaiono sempre nello stesso ordine (un primo, un secondo, un 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)
Ho eseguito questo codice solo la settimana scorsa e funzionava correttamente. Ma ora il mio codice è rotto e ottengo questo errore dalla linea [4]:
IndexError: out-of-bounds on slice (end)
ho fatto nessuna modifica al codice, ma ora sto ottenendo l'errore. Sento che questo è dovuto al fatto che il mio metodo non è robusto o appropriato.
Qualsiasi suggerimento o guida su come suddividere questa colonna di elenchi in colonne separate sarebbe molto apprezzato!
EDIT: Penso che la ToList() e metodi .Applicare non funzionano sul mio codice, perché è una stringa unicode, vale a dire:
#My data format
u{'a': '1', 'b': '2', 'c': '3'}
#and not
{u'a': '1', u'b': '2', u'c': '3'}
I dati sta importando dal database PostgreSQL in questo formato . Qualsiasi aiuto o idee con questo problema? c'è un modo per convertire l'unicode?
ho risposto con una soluzione un po 'diversa, ma, il codice dovrebbe realmente funzionare anche bene. Usando il mio esempio fittizio qui sotto, questo funziona usando pandas 0.18.1 se tralascio la parte 'iloc' – joris
Fa parte di esso che' iloc [:,: 3] 'presuppone che ci saranno 3 voci, e forse dati più recenti le slice hanno solo 1 o 2 (ad es. non ci sono 'b' come in' index 8813')? – dwanderson