在np.percentile中过滤掉零

时间:2017-05-03 19:15:05

标签: python pandas numpy percentile

我正在尝试对score的<{1}}列进行十进制。

我使用以下代码:

DataFrame

我的问题出在np.percentile(df['score'], np.arange(0, 100, 10)) ,有很多零。如何过滤掉这些0值并仅将其余值分解?

3 个答案:

答案 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))

答案 1 :(得分:1)

您可以使用boolean indexing简单地屏蔽零,然后将其从列中删除:

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

或一步到位:

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

答案 2 :(得分: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十进制

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]

或者一起

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