2013-04-11 12 views
11

Ho un dataframe panda che assomiglia a questo:come duplicare le righe in panda, sulla base di elementi in un elenco

COL  data 
line1 [A,B,C] 

in cui gli elementi nella colonna di dati potrebbero essere sia una lista o solo una virgola elementi separati . C'è un facile del modo di ottenere:

COL  data 
line1 A 
line1 B 
line1 C 

potevo iterare l'elenco e duplicare manualmente le file tramite python, ma c'è un po 'di magia panda trucco per fare questo? Il punto chiave è come duplicare automaticamente le righe.

Grazie!

risposta

6

Si potrebbe scrivere una semplice funzione di pulizia per rendere una lista (supponendo che non è un elenco di virgole, e non si può semplicemente utilizzare ast.literal_eval):

def clean_string_to_list(s): 
    return [c for c in s if c not in '[,]'] # you might need to catch errors 

df['data'] = df['data'].apply(clean_string_to_list) 

scorrendo le righe sembra un ragionevole scelta:

In [11]: pd.DataFrame([(row['COL'], d) 
         for d in row['data'] 
         for _, row in df.iterrows()], 
         columns=df.columns) 
Out[11]: 
    COL data 
0 line1 A 
1 line1 B 
2 line1 C 

temo non credo panda si rivolge specificamente per questo tipo di manipolazione.

+0

da dove provengono "riga" e "riga ['COL']"? –

+0

@AlexanderSupertramp all'interno della list comprehension 'per _, row in df.iterrows()'. _ È l'indice della riga, la riga è la riga di df come una serie. –

+4

Questo non ha funzionato per me come scritto; Avevo bisogno di cambiare i due 'for'statements:' [(row ['COL'], d) per _, riga in df.iterrows() per d nella riga ['data']] '. – RafG

Problemi correlati