2016-03-31 4 views
0

ersetzen Ich habe Umfragedaten, dass die Antworten wie dies in einem Pandas Datenrahmen angezeigt haben:Python: Wie die erste Instanz von unerwünschten Zeichen in einer Zeichenfolge mit Regex

A   B   C   D   E 
a. cattle c. bird  b. cat  a. cattle 1.20-60 
c. bird  b. cat  a. cattle b. cat  3.61-103 
b. cat  a. cattle c. bird  c. bird  2.10-19 

Ich versuche, die Antwort Bezug zu entfernen Zeichen/Zahlen ('a.', b. ',' c. ',' 1., '2.', 3.. ') und der Leerraum, der vor der eigentlichen Antwort auftritt, um etwas zu hinterlassen, das wie folgt aussieht:

A   B  C  D  E 
cattle bird  cat  cattle 20-60 
bird  cat  cattle cat  61-103 
cat  cattle bird  bird  10-19 

der folgende Code verwendet, ist ein Wörterbuch zu Staat, der Bezug durch eine ‚‘ ersetzt werden beantworten muss:

df[repval_cols].replace({ 
'a. ':'', 
'b. ':'', 
'c. ':'', 
'1.':'', 
'2.':'', 
'3.':'', 
    }, regex=True) 

Die [repval_cols] ist eine Liste von Spalten im Datenframe, die ich möchte, dass dies geschieht.

jedoch das Problem, das ich habe, ist, dass der Code, den ich von oben bin mit jeder Instanz des Zeichens innerhalb der Zeichenfolge entfernt in den Spalten, so dass es mich mit unsinnigen Daten wie diese Blätter:

A  B  C  D  E 
cttle ird  ct  cttle 0-60 
ird  ct  cttle ct  6-0 
ct  cttle ird  ird  0-9 

Könnte jemand Bitte erläutern Sie, warum Zeichen ersetzt werden, die nicht mit denen in meinem Wörterbuch übereinstimmen. Ich sage ausdrücklich, dass ich "a. 'mit' 'nicht irgendein' a 'innerhalb der Zeichenfolge.

Jede Beratung/Vorschläge stark

geschätzt wird

Antwort

1

Sie können die Zeichenfolge basierend auf der ersten Periode in zwei Teile aufteilen. Nimm dann den zweiten Gegenstand aus dem geteilten Paar und entferne den Leerraum.

>>> (df.apply(lambda s: s.str.split('.', n=1)) 
     .apply(lambda s: [pair[1].strip() for pair in s]) 
    ) 
     A  B  C  D  E 
0 cattle  bird  cat cattle 20-60 
1  bird  cat cattle  cat 90-300 
2  cat cattle  bird  bird 10-19 

Für Ihre Regex-Anweisung, müssen Sie die Periode (Punkt oder .) zu entkommen, die eine metacharacter in regex ist verwendet, um jedes Zeichen zu finden. Um einen literalen Punkt zu finden, müssen Sie diesen Punkt verlassen (\.).

>>> df.replace({ 
'a\. ': '', 
'b\. ': '', 
'c\. ': '', 
'1\.': '', 
'2\.': '', 
'3\.': ''}, regex=True) 
     A  B  C  D  E 
0 cattle bird  cat cattle 20-60 
1 bird  cat cattle  cat 90-300 
2  cat cattle bird bird 10-19 
+0

Danke @Alexanderfor das Erklären.als Metazeichen in Regex. Das behebt das Problem, das ich in meiner Regex-Anweisung hatte. – da4l

0

Sie brauchen keine Regex für diese Transformation.

die Zeichenfolge von . geteilt, nehmen Sie das zweite Element und strip

def parse(mystr): 
    return mystr.split('.')[1].strip() 

df[repval_cols].applymap(parse) 

Hier ist die Dokumentation für die applymap method. Sie wendet die bereitgestellte Funktion auf jedes Element im Datenrahmen an und ist analog zur Methode apply.

+0

Danke für den Input, habe ich versucht, diese zu meinen Datenrahmen zu übernehmen und ich erhalte immer diese Fehlermeldung: Indexerror: (Liste der Index außerhalb des Bereichs ', bei Index HMBLD' u'occurred). Die obige Antwort half mir, das Problem zu lösen, das ich mit der Regex-Anweisung hatte – da4l

0

I am explicitly saying to replace 'a. ' with '' not just any 'a' within the string.

Ihr Problem ist . Punkt, der für jedes Zeichen ein wildcard in regex ist. Mit \., die es entkommen und machen es Literal Punkt könnte Ihr Problem lösen.

So wird Ihr Code.

df[repval_cols].replace({ 
'a\. ':'', 
'b\. ':'', 
'c\. ':'', 
'1\.':'', 
'2\.':'', 
'3\.':'', 
    }, regex=True) 
+0

danke für die Info über die '.' Ein 'Wildcard' und Ihre Antwort behoben das Problem – da4l

+0

@ da4l: Bin froh, dass es getan hat. –

Verwandte Themen