2017-05-03 3 views
1

scoreDataFrameのデシールを試みています。np.percentileでゼロをフィルタリングする

私は次のコードを使用し

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

私の問題はscoreであるが、ゼロがたくさんあります。これらの0の値を除外し、残りの値を除外することはできますか?

答えて

3

はブール索引でそれらをフィルタリング:

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

または

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

とパーセンタイル機能にそれを渡します。

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

彼らは最近、これを追加しましたので、私は私が長い間持っているとき、私はそれを使用してきた(それが効率的であると仮定が、実際にそれをテストしたことはありません@MSeifertデータフレーム名)。少し見てみましょう。 :) – ayhan

+0

あなたは正しいです。列全体で動作するので、マスキングと同じ速さで実行されます。 – MSeifert

1

あなたは単にゼロをマスクしてからboolean indexingを使用して、カラムからそれらを削除することができます。

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

または1つのステップで:

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

は、データフレーム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 
考えてみましょう
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] 

またはすべてを十分位する使用pd.qcut一緒

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 
関連する問題