2016-11-10 2 views
4

저는 파이썬에서 일부 모델을 카테고리별로 데이터 하위 집합으로 실행하고 있습니다.팬더에서 사용되지 않는 카테고리를 신속하게 제거 할 수 있습니까?

메모리 사용 및 전처리의 경우 모든 범주 형 변수가 범주 데이터 형식으로 저장됩니다.

내 '그룹화'열에 범주 형 변수의 각 수준에 대해 회귀 분석을 실행합니다. 여기서 모든 범주 형 변수를 해당 하위 집합에있는 변수로 재설정해야합니다.

현재 총 실행 시간의 약 50 %를 차지하는 .cat.remove_unused_categories()을 사용하고 있습니다. 현재 최악의 범죄자는 제 그룹화 칼럼이고, 다른 사람들은 많은 시간을 들여 쓰지 않습니다 (내가 떨어 뜨릴만큼 많은 레벨이 없다고 생각합니다). 내 노트북에

import itertools 
import pandas as pd 
#generate some fake data 
alphabets = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 
keywords = [''.join(i) for i in itertools.product(alphabets, repeat = 2)] 
z = pd.DataFrame({'x':keywords}) 

#convert to category datatype 
z.x = z.x.astype('category') 

#groupby 
z = z.groupby('x') 

#loop over groups 
for i in z.groups: 
    x = z.get_group(i) 
    x.x = x.x.cat.remove_unused_categories() 
    #run my fancy model here 

, 이것은 약 20 초 정도 소요 :

다음은 간단한 예입니다. 이 작은 예제에서는 str으로 변환 한 다음 다시 카테고리로 돌아갈 수 있지만 실제 데이터에는 그룹당 최소 300 행이 있습니다.

이 루프의 속도를 높일 수 있습니까? 비슷한 시간이 걸리는 x.x = x.x.cat.set_categories(i)을 사용해 보았습니다. x.x.cat.categories = i은 내가 시작한 것과 같은 수의 카테고리를 묻습니다.

+1

와 함께 잘 작동합니다 :'X = z.get_group (I) .astype를 ({ 'X': 'STR'}). astype ({ 'X': ' category '})''다음 줄을 지우십시오 :'xx = xxcat.remove_unused_categories()'? 그것은 더 빠를 것인가가 흥미 롭습니다 ... – MaxU

+0

이것은 예제의 속도를 향상 시키지만, 실제 데이터는 그룹당 3 ~ 400 라인을 가지며 문자열 변환은이 경우 더 느립니다. – jeremycg

답변

6

z.get_group(i)x에 할당한다는 점에서 문제가 있습니다. x은 이제 z의 사본입니다. 귀하의 코드는 당신이 시도 할 수 있습니다이 변경

for i in z.groups: 
    x = z.get_group(i).copy() # will no longer be tied to z 
    x.x = x.x.cat.remove_unused_categories() 
+0

하지만 부모 DF의 모든 카테고리가 복사됩니다. 훨씬 빠르다고 생각합니까? – MaxU

+1

OP가 무슨 일을하고 있는지 잘 모르겠습니다! 그래서 나는 그들을 신뢰해야하고, 여기에 내 멋진 모델을 실어 가야한다. 나는이 코드를 돌렸고 SetWithCopy 경고를 출력했기 때문에 고통 스러웠다. 나는 그 라인을 바꾸고 그것은 곧 끝난다. – piRSquared

+0

이제 실행했습니다. 이것은 원래 코드의 문제입니다. 고맙습니다 만 - 데이터 구조에서'repeat = 2'를 3으로 늘리면 문제가 여전히 남아 있음을 알 수 있습니다.하지만이 수치는 런타임의 .5에서 0.05로 감소했습니다. – jeremycg