2017-10-30 1 views
1

아래와 같이 pandas 데이터 프레임에 열이 있습니다. 열 이름은 ABC팬더 데이터 프레임에서 regex를 사용하여 열 값 바꾸기

ABC 
Fuel 
FUEL 
Fuel_12_ab 
Fuel_1 
Lube 
Lube_1 
Lube_12_a 
cat_Lube 

는 지금 우리가 어떻게 pandas 데이터 프레임에서 문자열 매칭 이러한 유형의 작업을 수행 할 수 있습니다

ABC 
Fuel 
FUEL 
Fuel 
Fuel 
Lube 
Lube 
Lube 
cat_Lube 

아래처럼 정규식을 사용하여이 컬럼의 값을 대체 할 수 있습니다. str.extract

답변

3

를 사용하여 긍정적 인 lookbehind.

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'은 51 단계 대신에 19 단계를 사용합니다. – ctwheels

+0

@ctwheels 이렇게하면 더 좋습니다 : : re.compile ('(? <= lube | fuel) _. *', re.IGNORECASE) ' – piRSquared

+0

Ya stick 방금 언급 한 것과 함께, OP는 [MaxU의 대답] (https://stackoverflow.com/a/47024464/3600709) 아래의 주석에서 새로운 입력을 추가하여 다른 대답이 '\ d'사용을 중단하게 만듭니다. – 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

좋은 트릭 내 열이'Fuel_aa_12' 것이 작업이있는 경우 단지 작은 의심 @MaxU. –

+0

@piRSquared, 답변으로 추가하십시오! :) – MaxU

3

Alt 키 :

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 

확장 예의 piRSquared : lube 또는 fuel 경우를 무시하고 대한

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' 버전'df.ABC.str.extract ('(. * (? <= lube | fuel)). *', re.IGNORECASE, expand = False)' – piRSquared

+0

'^ '질의의 시작 부분에서 단계 수를 반으로 줄였습니다 (363 대신 180) – ctwheels

+0

@piRSquared 감사합니다. –

관련 문제