2016-07-14 175 views
9

Ho il seguente DataFrame. Mi chiedo se sia possibile rompere la colonna "dati" in più colonne. Per esempio, da questo:Pandas, DataFrame: divisione di una colonna in più colonne

 
ID  Date  data 
6  21/05/2016 A: 7, B: 8, C: 5, D: 5, A: 8 
6  21/01/2014 B: 5, C: 5, D: 7 
6  02/04/2013 A: 4, D:7 
7  05/06/2014 C: 25 
7  12/08/2014 D: 20 
8  18/04/2012 A: 2, B: 3, C: 3, E: 5, B: 4 
8  21/03/2012 F: 6, B: 4, F: 5, D: 6, B: 4 

in questo:

 
ID  Date  data       A B C D E F 
6  21/05/2016 A: 7, B: 8, C: 5, D: 5, A: 8 15 8 5 5 0 0 
6  21/01/2014 B: 5, C: 5, D: 7    0 5 5 7 0 0  
6  02/04/2013 B: 4, D: 7, B: 6    0 10 0 7 0 0 
7  05/06/2014 C: 25       0 0 25 0 0 0 
7  12/08/2014 D: 20       0 0 0 20 0 0 
8  18/04/2012 A: 2, B: 3, C: 3, E: 5, B: 4 2 7 3 0 5 0 
8  21/03/2012 F: 6, B: 4, F: 5, D: 6, B: 4 0 8 0 6 0 11 

Ho provato questo pandas split string into columns, e questo pandas: How do I split text in a column into multiple rows? ma non sono a lavorare nel mio caso.

EDIT

C'è un po 'di complessità della colonna "dati" ha valori duplicati per esempio nella prima riga "A" viene ripetuta, e quindi questi valori sono riassunti nella colonna "A" (per favore vedi la seconda tabella).

risposta

6

Ecco una funzione che può convertire la stringa in un dizionario e valori aggregati in base alla chiave; Dopo la conversione sarà facile per ottenere i risultati con il metodo pd.Series:

def str_to_dict(str1): 
    import re 
    from collections import defaultdict 
    d = defaultdict(int) 
    for k, v in zip(re.findall('[A-Z]', str1), re.findall('\d+', str1)): 
     d[k] += int(v) 
    return d 

pd.concat([df, df['dictionary'].apply(str_to_dict).apply(pd.Series).fillna(0).astype(int)], axis=1) 

enter image description here

3
df = pd.DataFrame([ 
     [6, "a: 1, b: 2"], 
     [6, "a: 1, b: 2"], 
     [6, "a: 1, b: 2"], 
     [6, "a: 1, b: 2"], 
    ], columns=['ID', 'dictionary']) 

def str2dict(s): 
    split = s.strip().split(',') 
    d = {} 
    for pair in split: 
     k, v = [_.strip() for _ in pair.split(':')] 
     d[k] = v 
    return d 

df.dictionary.apply(str2dict).apply(pd.Series) 

enter image description here

Oppure:

pd.concat([df, df.dictionary.apply(str2dict).apply(pd.Series)], axis=1) 

enter image description here

+0

Questo solo vi darà una serie e non dividere in più colonne. – user1124825

+0

@ user1124825 Ho modificato la risposta per includere un parser di stringa. La tua domanda originale menzionava la colonna "dizionario" era una colonna di dizionari. Ho pensato che fosse vero. Applicando un parser, la mia stessa risposta vale ancora. – piRSquared

Problemi correlati