2016-07-29 3 views
1

전체 누적 합계 비율을 기반으로 그룹을 만들려는 대규모 데이터 세트가 있습니다. 이 코드는 map 함수를 사용하여 작동하도록했습니다. 그룹을 더욱 세밀하게 만들고 싶다면이 말을하는 더 좋은 방법이 있을까요? 예를 들어 현재 5 % 증분을보고 있는데 ... 1 % 증분을보고 싶다면 어떻게해야할까요? "codethem"기능에 명시 적으로 입력 할 필요가없는 또 다른 방법이 있는지 궁금합니다.Python Pandas :지도를 사용하여 범위별 그룹 만들기

def codethem(dl): 
if dl < .05 : return '5' 
elif .05 < dl <= .1: return '10' 
elif .1 < dl <= .15: return '15' 
elif .15 < dl <= .2: return '20' 
elif .2 < dl <= .25: return '25' 
elif .25 < dl <= .3: return '30' 
elif .3 < dl <= .35: return '35' 
elif .35 < dl <= .4: return '40' 
elif .4 < dl <= .45: return '45' 
elif .45 < dl <= .5: return '50' 
elif .5 < dl <= .55: return '55' 
elif .55 < dl <= .6: return '60' 
elif .6 < dl <= .65: return '65' 
elif .65 < dl <= .7: return '70' 
elif .7 < dl <= .75: return '75' 
elif .75 < dl <= .8: return '80' 
elif .8 < dl <= .85: return '85' 
elif .85 < dl <= .9: return '90' 
elif .9 < dl <= .95: return '95' 
elif .95 < dl <= 1: return '100' 
else: return 'None' 

my_df['code'] = my_df['sales_csum_aspercent'].map(code them) 

고맙습니다!

답변

3

그에게 특별한 방법이있다 - pd.cut()

데모 :

가 만든 임의 DF :

In [393]: df = pd.DataFrame({'a': np.random.rand(10)}) 

In [394]: df 
Out[394]: 
      a 
0 0.860256 
1 0.399267 
2 0.209185 
3 0.773647 
4 0.294845 
5 0.883161 
6 0.985758 
7 0.559730 
8 0.723033 
9 0.126226 

pd.cut()를 호출 할 때 우리가 쓰레기통을 지정해야합니다 :

In [404]: np.linspace(0, 1, 11) 
Out[404]: array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]) 

In [395]: pd.cut(df.a, bins=np.linspace(0, 1, 11)) 
Out[395]: 
0 (0.8, 0.9] 
1 (0.3, 0.4] 
2 (0.2, 0.3] 
3 (0.7, 0.8] 
4 (0.2, 0.3] 
5 (0.8, 0.9] 
6  (0.9, 1] 
7 (0.5, 0.6] 
8 (0.7, 0.8] 
9 (0.1, 0.2] 
Name: a, dtype: category 
Categories (10, object): [(0, 0.1] < (0.1, 0.2] < (0.2, 0.3] < (0.3, 0.4] ... (0.6, 0.7] < (0.7, 0.8] < (0.8, 0.9] < (0.9, 1]] 

경우 우리는 맞춤 라벨을 원한다. xplicitly을 지정

참고 : 빈 라벨 빈의 수는

In [402]: labels = (bins[1:]*100).astype(int) 

In [412]: labels 
Out[412]: array([ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]) 

In [403]: pd.cut(df.a, bins=bins, labels=labels) 
Out[403]: 
0  90 
1  40 
2  30 
3  80 
4  30 
5  90 
6 100 
7  60 
8  80 
9  20 
Name: a, dtype: category 
Categories (10, int64): [10 < 20 < 30 < 40 ... 70 < 80 < 90 < 100] 

가장자리보다 하나 이하 여야을하자

In [419]: bins = np.linspace(0, 1, 21) 

In [420]: bins 
Out[420]: array([ 0. , 0.05, 0.1 , 0.15, 0.2 , 0.25, 0.3 , 0.35, 0.4 , 0.45, 0.5 , 0.55, 0.6 , 0.65, 0.7 , 0.75, 0.8 , 0.8 
5, 0.9 , 0.95, 1. ]) 

In [421]: labels = (bins[1:]*100).astype(int) 

In [422]: labels 
Out[422]: array([ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]) 

In [423]: pd.cut(df.a, bins=bins, labels=labels) 
Out[423]: 
0  90 
1  40 
2  25 
3  80 
4  30 
5  90 
6 100 
7  60 
8  75 
9  15 
Name: a, dtype: category 
Categories (20, int64): [5 < 10 < 15 < 20 ... 85 < 90 < 95 < 100] 
+0

@esc 5% 단계를 수행 해냈다 도움? – MaxU

+0

네, 트릭을 그렇게 많이 해줘서 고마워요! – esc