2017-09-18 4 views
1

Je ne suis pas sûr, si c'est le moyen le plus efficace, mais je travaille à regrouper les dépenses des clients dans des bacs/seaux.Python Python: catégoriser/bin par groupes numériques avec des valeurs nulles

C'est le df je travaille sur:

df.head() 

Best_ID_S| Dollar 
abc2464 0.00 
fdhg357 672.00 
hjg5235 250.00 
mjhur57 199.00 
erew3452 116.25 

Voici mon code:

bins = [0,250,500,750,1000,1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000,8000,1000000000000] 
#I didn't know how to create 8000+ so I just added a crazy number in the end, it works 

group_names = ['0-250','251-500','501-749','750-999','1000-1499','1500-1999','2000-2499','2500-2999','3000-3499','3500-3999','4000-4499','4500-4999','5000-5499','5500-5999','6000-6499','6500-6999','7000-7499','8000+'] 

categories = pd.cut(df_2014['Dollar'], bins, labels=group_names) 
df['Category'] = pd.cut(df['Dollar'], bins, labels=group_names) 
df['Buckets'] = pd.cut(df['Dollar'], bins) 

C'est ce que je reçois, quand je fais df.head():

Best_ID_S| Dollar | Category | Buckets 
abc2464 0.00  NaN 
fdhg357 672.00 501-749  (500, 750] 
hjg5235 250.00 0-250   (0, 250] 
mjhur57 199.00 0-250   (0, 250] 
erew3452 116.25 0-250   (0, 250] 

Lorsque la valeur en dollars est 0, j'ai besoin d'être le seau 0-250. Mais je reçois NaN.

Répondre

4

La valeur par défaut du paramètre right est true. Mathématiquement ( indique exclure le gauche, de sorte que doit être [ pour inclure la valeur dans la gauche. Donc, changer le pd.cut à

df['Category'] = pd.cut(df['Dollar'], bins, labels=group_names,right=False) 
df['Buckets'] = pd.cut(df['Dollar'], bins,right=False) 
 
Best_ID_S| Dollar Category  Buckets 
0 abc2464 0.00 0-250 [0, 250) 
1 fdhg357 672.00 501-749 [500, 750) 
2 hjg5235 250.00 251-500 [250, 500) 
3 mjhur57 199.00 0-250 [0, 250) 
4 erew3452 116.25 0-250 [0, 250) 

Encas de vous rendre à gauche inclus pouvez également définir include_lowest-True en gardant le bon paramètre True.

+0

Merci beaucoup! – jeangelj

1

Pour créer un bac au-dessus de 8000, vous pouvez utiliser le dernier bac comme np.inf

bins = [0,250,500,750,1000,1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000,8000,np.inf] 

Pour y compris la limite inférieure, vous pouvez utiliser le paramètre include_lowest = True

df['Category'] = pd.cut(df['Dollar'], bins, labels=group_names, include_lowest=True) 
df['Buckets'] = pd.cut(df['Dollar'], bins, include_lowest=True) 

Vous obtenez

Best_ID_S Dollar Category Buckets 
0 abc2464  0.00 0-250 [0, 250] 
1 fdhg357  672.00 501-749 (500, 750] 
2 hjg5235  250.00 0-250 [0, 250] 
3 mjhur57  199.00 0-250 [0, 250] 
4 erew3452 116.25 0-250 [0, 250] 
+0

J'ai ajouté qu'à la fin hahaha – Dark

+0

Oh ok, je l'ai vu maintenant :) – Vaishali

+0

La raison pour laquelle je n'ai pas ajouté la sortie est parce que j'ai 'df.loc [0, 'Buckets']' - '(-0.001 , 250.0] '. Une idée pourquoi? – Dark