2014-09-06 2 views
26

Ich habe einen Pandas Datenrahmen mit ungefähr 20 Spalten.Ersetze alle Vorkommen einer Zeichenkette in einem Pandas Datenrahmen (Python)

Es ist möglich, alle Vorkommen einer Zeichenfolge zu ersetzen (hier ein Newline) durch manuell alle Spaltennamen schreiben:

df['columnname1'] = df['columnname1'].str.replace("\n","<br>") 
df['columnname2'] = df['columnname2'].str.replace("\n","<br>") 
df['columnname3'] = df['columnname3'].str.replace("\n","<br>") 
... 
df['columnname20'] = df['columnname20'].str.replace("\n","<br>") 

Das funktioniert leider nicht:

df = df.replace("\n","<br>") 

Gibt es andere , elegantere Lösung?

Antwort

56

Sie können replace verwenden und die Saiten passieren suchen/ersetzen als Dictionary-Schlüssel/Einheiten:

df.replace({'\n': '<br>'}, regex=True) 

Zum Beispiel:

>>> df = pd.DataFrame({'a': ['1\n', '2\n', '3'], 'b': ['4\n', '5', '6\n']}) 
>>> df 
    a b 
0 1\n 4\n 
1 2\n 5 
2 3 6\n 

>>> df.replace({'\n': '<br>'}, regex=True) 
    a  b 
0 1<br> 4<br> 
1 2<br> 5 
2 3  6<br> 
+0

Das ist für mich nicht funktioniert! Pandas Version '0.15.1', ​​Python 2.7.9, Ubuntu 14.04. –

+1

'Python 2.7.9 | Anaconda 2.1.0 (64-Bit) | (Standard, 9. März 2015, 16:20:48) [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] unter linux2 Geben Sie "Hilfe", "Copyright", "Credits" oder "Lizenz" ein Mehr Informationen. Anaconda wird Ihnen von Continuum Analytics zur Verfügung gestellt. Bitte überprüfen Sie: http://continuum.io/thanks und https://binstar.org >>> Pandas importieren als pd >>> df = pd.DataFrame ({'a': ['1 \ n ',' 2 \ n ',' 3 '],' b ': [' 4 \ n ',' 5 ',' 6 \ n ']}) >>> df ab 0 1 \ n 4 \ n 1 2 \ n 5 2 3 6 \ n >>> df.replace ({ '\ n': '
'}) ab 0 1 \ n 4 \ n 1 2 \ n 5 2 3 6 \ n >>> ' –

+0

Danke für das Aufzeigen, @YichuanWang. –

9

Es scheint Pandas seine API ändern Mehrdeutigkeiten zu vermeiden hat, wenn Umgang mit Regex. Jetzt sollten Sie verwenden:

df.replace({'\n': '<br>'}, regex=True) 

Zum Beispiel:

>>> df = pd.DataFrame({'a': ['1\n', '2\n', '3'], 'b': ['4\n', '5', '6\n']}) 
>>> df 
    a b 
0 1\n 4\n 
1 2\n 5 
2 3 6\n 

>>> df.replace({'\n': '<br>'}, regex=True) 
    a  b 
0 1<br> 4<br> 
1 2<br> 5 
2 3  6<br> 
+5

Sie können auch "inplace = True" verwenden, um das Erstellen einer Kopie zu vermeiden - http: //pandas.pydata. org/pandas-docs/stable/generiert/pandas.DataFrame.replace.html –

0

Dadurch werden alle Zeilenumbrüche und unecessary Leerzeichen entfernen. Sie können die ‚‘ .join bearbeiten ein Ersatzzeichen angeben

df['columnname'] = [''.join(c.split()) for c in df['columnname'].astype(str)]