2016-08-08 31 views
2

Ich bin neu im Programmieren und würde mich über Ihre Einsichten freuen!Python Wie man die angegebene Zeichenkette in [] Klammern im Pandas Dataframe extrahiert und eine neue Spalte mit booleschen Werten erstellt

Ich habe einen Datenrahmen wie diesen.

df;

  info    Price 
0 [100:Sailing]    $100 
1 [150:Boating, 100:Sailing] $200 
2 [200:Surfing]    $300 

Ich möchte neue Spalten mit Aktivität Namen auf Informationen in Infospalte basierend erstellen und 1 in der neuen Spalte hinzufügen, wenn es einen entsprechenden Namen in Info-Spalte ist. Es wird wie ein Datenrahmen unten aussehen.

Price Sailing Boating Surfing 
0 $100  1   0  0 
1 $200  1   1  0 
2 $300  0   0  1 

habe ich versucht, einen Code Schlag aber hat nicht funktioniert .. (obwohl dieser Ansatz in anderen Spalten funktioniert)

df1 = df.info.str.extract(r'(Boating|Sailing|Surfing)',expand=False) 
df2 = pd.concat([df,pd.get_dummies(df1).astype(int)],axis=1) 

Ich habe mehr als 10 Tausende von Daten wie diese so idealy würde Ich mag schreiben ein Code, der automatisch die angegebene Zeichenfolge (wie Surfen) in der Info-Spalte extrahiert, erstellt eine neue Spalte mit dem Namen der Aktivität und gibt 1 oder 0 zurück, wie oben gezeigt. Ich dachte, dass Klammern in den Daten oder Datentypen im Dataframe das Problem verursachen, aber ich bin nicht sicher, wie ich das angehen soll.

Antwort

5

Ich nahm an, dass das Format der Werte in der Info-Spalte wie eine Python-Liste ist .

df1 = df['info'].str[1:-1].str.replace(' ', '').str.get_dummies(',') 
df1.rename(columns=lambda x: x.rsplit(':')[-1], inplace=True) 
df2 = pd.concat([df, df1.astype(int)], axis=1) 

df2 
Out: 
         info Price Sailing Boating Surfing 
0    [100:Sailing] $100  1  0  0 
1 [150:Boating, 100:Sailing] $200  1  1  0 
2    [200:Surfing] $300  0  0  1 
+0

Vielen Dank für den Hinweis! Ich konnte über diesen Ansatz nicht nachdenken;) Als ich den Code ausführte, bekam ich einen Fehler wie diesen "AttributeError: Kann .str accessor nur mit Zeichenfolgenwerten verwenden, die np.object_ dtype in Pandas verwenden". Der Fehler klingt wie Werte in der Info-Spalte ist kein String-Wert und ich muss es irgendwie ändern, um den Code auszuführen .. (?) Haben Sie eine Idee, was diesen Fehler verursacht? – yusuke0426

+0

Sie können tatsächliche Listen sein, denke ich. Kannst du das als erste Zeile versuchen? Df1 = df ['info']. Str.join ('___'). Str.get_dummies ('___') ' – ayhan

+0

Wow! Es funktioniert wie eine Magie! Ich danke dir sehr! Ich erkannte, dass 'df ['info']. Str.join ('___')' Klammern in der Info-Spalte magisch löscht. Aber ich habe nicht verstanden, wie diese Logik funktioniert. Können Sie die Rolle von .str.join ('___') 'und' .str.get_dummies ('___') '? Ich möchte das wirklich verstehen. – yusuke0426