2016-07-14 44 views
9

Mam następujące DataFrame. Zastanawiam się, czy możliwe jest podzielenie kolumny "dane" na wiele kolumn. Na przykład, z tego:Pandy, DataFrame: Dzielenie jednej kolumny na wiele kolumn

 
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 

w tym:

 
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 

Próbowałem to pandas split string into columns, a to pandas: How do I split text in a column into multiple rows? ale nie działa w moim przypadku.

EDIT

Jest nieco zawiłości „dane” kolumna ma powtarzające się wartości, na przykład, w pierwszej linii „A” jest powtarzany, a zatem te wartości są sumowane zgodnie z „A” kolumny (patrz druga tabela).

Odpowiedz

6

Oto funkcja, która może przekonwertować ciąg do słownika i wartości zagregowanych w oparciu o klucz; Po konwersji będzie to łatwe, aby uzyskać wyniki z metodą 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

Lub:

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

enter image description here

+0

To tylko daje serię i nie podzielony na wiele kolumn. – user1124825

+0

@ user1124825 Edytowałem odpowiedź, aby uwzględnić parser napisów. W pierwotnym pytaniu wspomniano o kolumnie "słownik", która była kolumną słowników. Zakładałem, że to prawda. Po zastosowaniu analizatora składni moja odpowiedź nadal jest taka sama. – piRSquared

Powiązane problemy