2016-07-29 5 views
1

私は、合計の累積合計パーセントに基づいてグループを作成するための大きなデータセットを用意しています。私はマップ関数を使用してこれを動作させるようにしました。下記のコードを参照してください。グループをより細かくしたいと思ったら、これを行うためのよりよい方法はありますか?例えば、現在は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] 

エッジより1少ない数でなければなりません5%ステップ

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でそれを行うことができますが、それをやりました助けて? – MaxU

+0

はい、ありがとうございました! – esc

関連する問題