2017-10-30 5 views
1

Ich habe eine Spalte in pandas Datenrahmen wie unten. Spaltenname ist ABCErsetzen Spaltenwerte mit Regex in Pandas Datenrahmen

ABC 
Fuel 
FUEL 
Fuel_12_ab 
Fuel_1 
Lube 
Lube_1 
Lube_12_a 
cat_Lube 

Jetzt habe ich die Werte in dieser Spalte ersetzen möchten, mit regex wie unten

ABC 
Fuel 
FUEL 
Fuel 
Fuel 
Lube 
Lube 
Lube 
cat_Lube 

Wie können wir diese Art von String-Matching tun in pandas Datenrahmen.

Antwort

3

Verwenden positive Lookbehind für lube oder fuel während Fall ignorieren.

import re 
import pandas as pd 

pat = re.compile('(?<=lube|fuel)_', re.IGNORECASE) 

df.assign(ABC=[re.split(pat, x, 1)[0] for x in df.ABC]) 

     ABC 
0  Fuel 
1  FUEL 
2  Fuel 
3  Fuel 
4  Lube 
5  Lube 
6  Lube 
7 cat_Lube 
+0

'_ \ d' verwendet 19 Schritte anstelle von 51 Schritten – ctwheels

+0

@ctwheels, also ist das noch besser?' 'Re.compile ('(? <= Lube | fuel) _. *', Re.IGNORECE)' – piRSquared

+0

Ya Stock Mit dem Kommentar, den Sie gerade kommentiert haben, fügte OP neue Kommentare hinzu [MaxU's Antwort] (https://stackoverflow.com/a/47024464/3600709), was dazu führt, dass die anderen Antworten auf '\ d' aufbrechen. – ctwheels

3
In [63]: df.ABC.str.replace(r'_\d+.*', r'') 
Out[63]: 
0  Fuel 
1  FUEL 
2  Fuel 
3  Fuel 
4  Lube 
5  Lube 
6  Lube 
7 cat_Lube 
Name: ABC, dtype: object 
+1

'df.ABC.str.split ('_ \ d', 1) .str [0]' – piRSquared

+0

@MaxU Guter Trick nur einen kleinen Zweifel, ob meine Spalte 'Fuel_aa_12' wird diese Arbeit. –

+0

@piRSquared, bitte fügen Sie es als Antwort hinzu! :) – MaxU

3

Alt mit str.extract:

df.ABC.str.extract('^(.*?)(?=_\d|$)', expand=False) 

0  Fuel 
1  FUEL 
2  Fuel 
3  Fuel 
4  Lube 
5  Lube 
6  Lube 
7 cat_Lube 
Name: ABC, dtype: object 

Erweiterung mit freundlicher Genehmigung piRSquared:

df.ABC.str.extract('(.*(?<=lube|fuel)).*', re.IGNORECASE, expand=False) 

0  Fuel 
1  FUEL 
2  Fuel 
3  Fuel 
4  Lube 
5  Lube 
6  Lube 
7 cat_Lube 
Name: ABC, dtype: object 
+0

'pd.Series.str.extract' Version' df.ABC.str.extract ('(. * (? <= Lube | fuel)). *', Re.IGNORECASE, expand = False) ' – piRSquared

+0

Hinzufügen von'^'am Anfang der Abfrage die Anzahl der Schritte halbiert (180 statt 363) – ctwheels

+0

@piRSquared Danke, sieht gut aus. –

Verwandte Themen