2016-07-14 31 views
9

Ich habe den folgenden DataFrame. Ich frage mich, ob es möglich ist, die Spalte "Daten" in mehrere Spalten aufzuteilen. Zum Beispiel, von hier:Pandas, DataFrame: Teilen einer Spalte in mehrere Spalten

 
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 diese:

 
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 

Ich habe diese pandas split string into columns versucht, und diese pandas: How do I split text in a column into multiple rows? aber sie sind in meinem Fall nicht funktioniert.

EDIT

ein wenig Komplexität gibt es die „Daten“ -Spalte doppelte Werte beispielsweise in der ersten Reihe hat „A“ wird wiederholt, und daher werden diese Werte unter der Spalte „A“ aufsummiert (Bitte siehe zweite Tabelle).

Antwort

6

Hier ist eine Funktion, die die Zeichenfolge in ein Wörterbuch und Aggregatwerte basierend auf dem Schlüssel umwandeln kann; Nach dem Umbau wird es leicht sein, die Ergebnisse mit dem pd.Series Methode zu erhalten:

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

Oder:

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

enter image description here

+0

Dies wird Ihnen nur eine Serie geben und nicht in mehrere Spalten aufgeteilt. – user1124825

+0

@ user1124825 Ich habe die Antwort bearbeitet, um einen String-Parser einzuschließen. Ihre ursprüngliche Frage erwähnt die Spalte mit der Bezeichnung "Dictionary" war eine Spalte von Wörterbüchern. Ich nahm an, dass das wahr ist. Wenn ich einen Parser anwende, gilt meine Antwort immer noch. – piRSquared

Verwandte Themen