2016-07-14 48 views
9

Aşağıdaki DataFrame'im var. "Veri" sütununu birden çok sütuna kırmanın mümkün olup olmadığını merak ediyorum. Bundan Ör: bu işePandalar, DataFrame: Birden çok sütuna bir sütun ayırma

 
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 

:

 
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 

Bu pandas split string into columns çalıştı ve bu pandas: How do I split text in a column into multiple rows? ama onlar benim durumumda çalışmıyor olması.

DÜZENLEME karmaşıklık biraz "veri" sütun "A" tekrar edilir ve bu nedenle, bu değerler, "A" sütununun altında toplanır (ilk satır, örneğin yinelenen değerlere sahip bulunmaktadır

lütfen ikinci tabloya bakınız).

cevap

6

bir sözlüğe ve anahtar dayalı toplam değerleri dize dönüştürebilen bir fonksiyondur; Dönüşümden sonra pd.Series yöntemi ile sonuç almak kolay olacak:

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

Veya:

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

enter image description here

+0

Bu yalnızca size bir dizi verecek ve birden çok sütun ayrılmıştır yoktur. – user1124825

+0

@ user1124825 Yanıtı bir string ayrıştırıcı içerecek şekilde düzenledim. Orijinal sorunuz, '' sözlük '' etiketli sütunu, sözlüklerin bir sütunuydu. Bunun doğru olduğunu varsaydım. Bir çözümleyici uygulayarak, aynı cevabım hala geçerli. – piRSquared

İlgili konular