2016-05-31 5 views
2

텍스트 데이터로 작업 중이므로 기존 열을 기반으로 새 열을 채우고 싶습니다.분할을 사용하여 Pandas 데이터 프레임에서 열을 채 웁니다.

예 : 열 sourceEncodedIDa.b.c과 같은 값을 가질 수 있으며 두 번째 부분이있는 경우 b 문자열의 두 번째 부분 만 추출하고 싶습니다. 여기에 몇 가지 예제 값은 다음과 같습니다

은 20K dataframe의 행 및 코드의 또이 작품이 있습니다
for i in range(0,20350): 
    if len(str(artifacts.sourceEncodedID[i]).split('.')) > 1: 
     artifacts['branch'][i] = str(artifacts.sourceEncodedID[i]).split('.')[1] 
    else: 
     artifacts['branch'][i] = str(artifacts.sourceEncodedID[i]) 

로 분 정도 걸릴 :

sourceEncodedID Branch  
a.b.c    b  
c.r.d    r  
a     a  
p     p 

는이를 달성하기 위해, 나는 다음과 같은 코드로 올라와있다 실행을 끝내기 전에 브라우저를 응답이 없게 끝내기 전에 (나는 ipython notebook을 사용하고 있습니다). 나는 이것이 2 초 내에 돌아갈 것이라고 생각했을 것이다.

내가 잡을 수없는이 코드에는 분명히 어리석은 것이 있습니까? 어떻게 수정해야합니까?

답변

1

UPDATE2 : - :

x['new'] = x.sourceEncodedID.str.replace(r'[^\.]*\.([^\.]*).*', r'\1') 

타이밍 20K에 DF : 나는이 조금 빠를 것으로 예상

In [155]: x.shape 
Out[155]: (20000, 2) 

In [156]: %timeit x['new'] = x.sourceEncodedID.str.replace(r'[^\.]*\.([^\.]*).*', r'\1') 
10 loops, best of 3: 127 ms per loop 

UPDATE :

In [68]: x['new'] = x.sourceEncodedID 

In [69]: x 
Out[69]: 
    sourceEncodedID Branch new 
0   a.b.c  b a.b.c 
1   c.r.d  r c.r.d 
2    a  a  a 
3    p  p  p 

In [70]: x.ix[x.sourceEncodedID.str.contains('\.'), 'new'] = x.sourceEncodedID.str.split('\.', expand=True)[1] 

In [71]: x 
Out[71]: 
    sourceEncodedID Branch new 
0   a.b.c  b b 
1   c.r.d  r r 
2    a  a a 
3    p  p p 

하는 작업 팬더 데이터 프레임을 항상 먼저 벡터화 된 솔루션을 찾으십시오. 그리고 절대적으로 불가능한 경우에만 이중 검사를하고 그 후에 루프를 통해 반복적으로 시도해보십시오. 속도가 느려질수록 더 느려질 것입니다.

OLD 답 :

이 시도 :

In [61]: x.sourceEncodedID.str.split('\.', expand=True)[1] 
Out[61]: 
0  b 
1  r 
2 None 
3 None 
Name: 1, dtype: object 
+0

정말 고마워요, 작업을했다. 제 코드에 나와 분명하지 않은 어리 석음을 지적 해 주시겠습니까? – Patthebug

+0

@Patthebug, 내 답변을 업데이트했습니다 - 확인하십시오 – MaxU

+0

설명을 추가해 주셔서 감사합니다, 고맙습니다! 팬더의 벡터화 된 기능을 알고 기본으로 돌아가는 것은 약간의 좌절감을 안겨주는 것 같습니다. 나는 벡터화 된 솔루션이 더 깔끔하지만 당신이 그것들을 알아야한다는 데 동의한다. 한 번에 하나의 기능 !! – Patthebug

관련 문제