2017-03-26 3 views
4

Ich habe einen Datensatz wie unten:Pandas Liste von Wörterbuch trennen Spalten

name status number message 
matt active 12345 [job: , money: none, wife: none] 
james active 23456 [group: band, wife: yes, money: 10000] 
adam inactive 34567 [job: none, money: none, wife: , kids: one, group: jail] 

Wie kann ich die Schlüssel-Wert-Paare extrahieren und sie in einen Datenrahmen alle aus dem Weg erweitert?

Erwarteter Ausgang:

name status number job money wife group kids 
matt active 12345  none none  none none none 
james active 23456  none 10000 none band none 
adam inactive 34567  none none  none none one 

Die Nachricht mehrere verschiedene Schlüsseltypen enthält.

Jede Hilfe würde sehr geschätzt werden.

Antwort

4

Es ist nicht einfach.

Brauchen Werte list von dict durch replace konvertieren (\s+ ein oder mehr Leerzeichen) und dann ast verwenden.

Dann mögliche Verwendung DataFrame Konstruktor mit concat, pop Drop Spalte von df ist:

import ast 
df.message = df.message.replace([':\s+,','\[', '\]', ':\s+', ',\s+'], 
           ['":"none","', '{"', '"}', '":"', '","'], regex=True) 
df.message = df.message.apply(ast.literal_eval) 

df1 = pd.DataFrame(df.pop('message').values.tolist(), index=df.index) 
print (df1) 
    kids money group job money wife 
0 NaN none NaN none NaN none 
1 NaN NaN band NaN 10000 yes 
2 one NaN jail none none none 

df = pd.concat([df, df1], axis=1) 
print (df) 
    name status number kids money group job money wife 
0 matt active 12345 NaN none NaN none NaN none 
1 james active 23456 NaN NaN band NaN 10000 yes 
2 adam inactive 34567 one NaN jail none none none 

EDIT:

Eine andere Lösung mit yaml:

import yaml 

df.message = df.message.replace(['\[','\]'],['{','}'], regex=True).apply(yaml.load) 

df1 = pd.DataFrame(df.pop('message').values.tolist(), index=df.index) 
print (df1) 
    group job kids money wife 
0 NaN None NaN none none 
1 band NaN NaN 10000 True 
2 jail none one none None 

df = pd.concat([df, df1], axis=1) 
print (df) 
    name status number group job kids money wife 
0 matt active 12345 NaN None NaN none none 
1 james active 23456 band NaN NaN 10000 True 
2 adam inactive 34567 jail none one none None 
1

Sie es als eine Liste markiert aber sagen, dass es ein Wörterbuch, so sollte diese Arbeit:

pd.concat([data.drop(['message'], axis=1), data['message'].apply(pd.Series)], axis=1) 
+0

Es ist eine Liste in der Spalte, aber sein Doppelpunkt trennte Werte. Das einzige Problem, das ich habe, ist, ich habe leere Werte. Dieses Stück hat leider nicht funktioniert. – johnnyb

+0

Die Spalten wurden als numerische Werte anstelle des Schlüssels {key: value} gekennzeichnet. – johnnyb

Verwandte Themen