2017-12-21 1 views
-1

Ich habe einen Datenrahmen, wo ein Spaltennamen enthält, und einen Teil davon in Klammern ist, etwa so:Ersetzen Pandas Spaltenwert mit dem Wert in Klammern, mit Komma vor

Names 
Apple (juicy) 
Banana (crunchy) 
Grape (sour) 

Ich will es ändern zu das folgende Format:

Names 
Apple, juicy 
Banana, crunchy 
Grape, sour 

Wie dies erreicht werden kann Pandas und regex? Ich habe dies versucht:

df['Names'] = df1['Names'].str.replace(r"\s+\(.*\)",", " + r"\(.*\)") 

aber das Problem ist in dem letzten Bit (r „(*).“), Wo ich weiß nicht, wie erfolgreich zu übertragen, was auch immer in der Klammer ist. Mit dem obigen Code bekomme ich das:

+0

Warum Regex? Das verursacht Ihnen Probleme und Sie brauchen es nicht. '.replace ('(', ',') .replace (')', '')' ist einfacher zu schreiben und zu verstehen und kommuniziert Ihre Absicht deutlicher. – Goyo

+0

Hm, ich bekomme diesen Fehler: sre_constants.error: missing), unterminiertes Submuster an Position 1 – ilee

+0

Sieht so aus, als müssten Sie einige Zeichen im Datenframe-Accessor umgehen: 'df ['Names']. Str.replace ('\ (' , ',') .str.replace (')', '') '. Oder benutzen Sie 'apply' wie in einer Anfrage vorgeschlagen. – Goyo

Antwort

1

Verwenden Sie Erfassungsgruppe und beziehen Sie die erfassten Zeichen im Ersatzteil durch Rückverweis.

df['Names'] = df1['Names'].str.replace(r"\s+\((.*)\)", r", \1") 
+0

Ich denke du meinst df ['Names'] = df1 ['Names']. Str.replace (r "\ s + \ ((*) \)", r ", \ 1") was funktioniert! Vielen Dank! – ilee

+0

@ilee Du meinst eine Regex mit nicht-eckigen Klammern? Nein, das habe ich nicht so gemeint. siehe https://regex101.com/r/uyRFy5/1 –

+0

Oh Entschuldigung, ich habe Ihren Code falsch gelesen. Du hast absolut recht :) – ilee

1

Müssen Sie regex verwenden?

können Sie dies tun

df['Names'] = df.Names.apply(lambda x: x.replace('(','').replace(')','')) 

, dass jede Klammer in eine beliebige Zeichenfolge entfernen würde.

Verwandte Themen