2012-12-03 3 views
61

DataFrame 열의 문자열에서 불필요한 부분을 제거하는 효율적인 방법을 찾고 있습니다. 내가 .str.lstrip('+-') 및 시도팬더 DataFrame : 열의 문자열에서 불필요한 부분 제거

time result 
1 09:00 52 
2 10:00 62 
3 11:00 44 
4 12:00 30 
5 13:00 110 

: 나는 이러한 데이터를 손질 할 필요가

time result 
1 09:00 +52A 
2 10:00 +62B 
3 11:00 +44a 
4 12:00 +30b 
5 13:00 -110a 

: 같은

데이터 보인다. str.rstrip('aAbBcC'), 오류 :

TypeError: wrapper() takes exactly 1 argument (2 given) 

모든 포인터가 크게 감사하겠습니다!

+0

'extract' 메소드를 사용하여 이것을 수행하는 매우 간단한 방법이 있습니다. [아래의이 답변] (https://stackoverflow.com/a/47107237/3707607)을 참조하십시오. –

답변

79
data['result'] = data['result'].map(lambda x: x.lstrip('+-').rstrip('aAbBcC')) 
+0

thx! 그 작품. 나는 여전히 맵() 주위에 내 마음을 사용하고 있는지, 사용하지 않을지 확신하지는 않는다. –

+0

이 메소드가 replace 함수와 함께 작동한다는 것을 알게되어 기뻤다. – BKay

+0

@eumiro 각 열을 반복 할 경우이 결과를 어떻게 적용합니까? – medev21

12

여기에 버그가있다 : 현재 str.lstripstr.rstrip에 인수를 전달할 수 없습니다 :

http://github.com/pydata/pandas/issues/2411

편집 : 2012년 12월 7일이 dev에 지점에 지금 작동합니다

In [8]: df['result'].str.lstrip('+-').str.rstrip('aAbBcC') 
Out[8]: 
1  52 
2  62 
3  44 
4  30 
5 110 
Name: result 
+0

그것은 나를 위해 작동하는 것 같다, 내가 여기 sth을 놓친 건가요? –

18

데이터 프레임 열에서 제거 할 위치의 수를 알고있는 특별한 경우에는 다음을 수행 할 수 있습니다. 람다 함수 내에서 사용하는 문자열 색인은 그 부분을 없애 :

마지막 문자 :

data['result'] = data['result'].map(lambda x: str(x)[:-1]) 

처음 두 문자 :

data['result'] = data['result'].map(lambda x: str(x)[2:]) 
+0

지오 좌표를 8 자 ((.), (-) 포함)로 자르고 8보다 작은 경우 마지막으로 '0'을 삽입하여 모든 좌표를 8 자로 만들어야합니다. 그렇게하는 것이 더 쉬운 방법은 무엇입니까? –

+0

문제를 완전히 이해하지 못했지만 "{0 : .8f}"와 같이 람다 함수를 변경해야 할 수도 있습니다. format (x) – MonkeyButter

+0

답장을 보내 주셔서 감사합니다. 간단히 말해 위도와 경도를 두 개의 열로 나타내는 지리 좌표가있는 데이터 프레임이 있습니다. 문자의 길이는 8 자 이상이고 처음부터 시작하여 (-) 및 (.)를 포함하는 8 자만 계속 유지했습니다. –

29

내가, 기능을 대체 할 매우 간단 팬더를 사용하는 것을 regex를 사용할 수있는 것처럼 강력합니다. 아래 정규식 \ D 모든 비 숫자 문자를 제거하려면 사용하고 있지만 분명히 당신은 정규식으로 아주 창조적 얻을 수 있습니다.

data['result'].replace(regex=True,inplace=True,to_replace=r'\D',value=r'') 
+0

나는 이것을 시도하고 그것은 작동하지 않습니다. 난 당신이 부분 문자열을 교체 대신 전체 문자열을 교체하려는 경우에만 작동하는지 궁금하네요. – bgenchel

+0

@bgenchel -이 메서드를 사용하여 pd.Series에서 문자열의 일부를 대체했습니다. replace (regex = True, to_replace = "my_prefix", value = "new_prefix") '. 그러면 "my_prefixaaa"와 같은 문자열이 "new_prefixaaa"로 변환됩니다. – Jakub

5

이와 같은 작업 (예 : DataFrame 내의 모든 시리즈 요소 수정)에서 다양한 성능 차이가 있음을 확인했습니다. 종종 지능형리스트는 가장 빠르게 할 수 있습니다 - 아래 코드 인종 참조 : 결과 열이 권리를 넣어

import pandas as pd 
#Map 
data = pd.DataFrame({'time':['09:00','10:00','11:00','12:00','13:00'], 'result':['+52A','+62B','+44a','+30b','-110a']}) 
%timeit data['result'] = data['result'].map(lambda x: x.lstrip('+-').rstrip('aAbBcC')) 
10000 loops, best of 3: 187 µs per loop 
#List comprehension 
data = pd.DataFrame({'time':['09:00','10:00','11:00','12:00','13:00'], 'result':['+52A','+62B','+44a','+30b','-110a']}) 
%timeit data['result'] = [x.lstrip('+-').rstrip('aAbBcC') for x in data['result']] 
10000 loops, best of 3: 117 µs per loop 
#.str 
data = pd.DataFrame({'time':['09:00','10:00','11:00','12:00','13:00'], 'result':['+52A','+62B','+44a','+30b','-110a']}) 
%timeit data['result'] = data['result'].str.lstrip('+-').str.rstrip('aAbBcC') 
1000 loops, best of 3: 336 µs per loop 
+0

고마워, 나는 누군가가이 방법들에 시간을 맞추기를 정말로 바라고 있었다. 이것들은 많은 좋은 해결책입니다. – griffinc

-8
=RIGHT(LEFT(O13,(LEN(O13)-1)),LEN(LEFT(O13,(LEN(O13)-1))-1)) 

을하고 결과를 얻을.

3

매우 간단한 방법은 extract 방법을 사용하여 모든 자릿수를 선택하는 것입니다. 임의의 숫자를 추출하는 정규 표현식 '\d+'을 입력하기 만하면됩니다.

df['result'] = df.result.str.extract('(\d+)', expand=True).astype(int) 
df 

    time result 
1 09:00  52 
2 10:00  62 
3 11:00  44 
4 12:00  30 
5 13:00  110