2017-05-03 1 views
1

J'essaie de déciler la colonne score d'un DataFrame.Filtrer les zéros dans np.percentile

J'utilise le code suivant:

np.percentile(df['score'], np.arange(0, 100, 10)) 

Mon problème est score, il y a beaucoup de zéros. Comment puis-je filtrer ces 0 valeurs et ne décile que le reste des valeurs?

Répondre

3

les filtre avec indexation booléenne:

df.loc[df['score']!=0, 'score'] 

ou

df['score'][lambda x: x!=0] 

et passe à ce que la fonction de percentile.

np.percentile(df['score'][lambda x: x!=0], np.arange(0,100,10)) 
+0

@MSeifert Comme ils l'ont ajouté récemment, je suppose que ce serait efficace, mais jamais réellement testé (je l'ai utilisé quand j'ai longtemps Noms DataFrame). Laisse-moi regarder un peu. :) – ayhan

+0

Vous avez raison. Il fonctionne sur des colonnes entières, donc il fonctionne aussi vite que le masquage. – MSeifert

1

Vous pouvez simplement masquer les zéros et les supprimer de votre colonne en utilisant boolean indexing:

score = df['score'] 
score_no_zero = score[score != 0] 
np.percentile(score_no_zero, np.arange(0,100,10)) 

ou en une seule étape:

np.percentile(df['score'][df['score'] != 0], np.arange(0,100,10)) 
1

Considérons le dataframe df

df = pd.DataFrame(
    dict(score=np.random.rand(20)) 
).where(
    np.random.choice([True, False], (20, 1), p=(.8, .2)), 
    0 
) 

     score 
0 0.380777 
1 0.559356 
2 0.103099 
3 0.800843 
4 0.262055 
5 0.389330 
6 0.477872 
7 0.393937 
8 0.189949 
9 0.571908 
10 0.133402 
11 0.033404 
12 0.650236 
13 0.593495 
14 0.000000 
15 0.013058 
16 0.334851 
17 0.000000 
18 0.999757 
19 0.000000 

Utilisez pd.qcut pour décile

pd.qcut(df.loc[df.score != 0, 'score'], 10, range(10)) 

0  4 
1  6 
2  1 
3  9 
4  3 
5  4 
6  6 
7  5 
8  2 
9  7 
10 1 
11 0 
12 8 
13 8 
15 0 
16 3 
18 9 
Name: score, dtype: category 
Categories (10, int64): [0 < 1 < 2 < 3 ... 6 < 7 < 8 < 9] 

Ou tous ensemble

df.assign(decile=pd.qcut(df.loc[df.score != 0, 'score'], 10, range(10))) 

     score decile 
0 0.380777 4.0 
1 0.559356 6.0 
2 0.103099 1.0 
3 0.800843 9.0 
4 0.262055 3.0 
5 0.389330 4.0 
6 0.477872 6.0 
7 0.393937 5.0 
8 0.189949 2.0 
9 0.571908 7.0 
10 0.133402 1.0 
11 0.033404 0.0 
12 0.650236 8.0 
13 0.593495 8.0 
14 0.000000 NaN 
15 0.013058 0.0 
16 0.334851 3.0 
17 0.000000 NaN 
18 0.999757 9.0 
19 0.000000 NaN