将多个条件值分配给百分位数到新的pandas列

时间:2018-03-26 22:16:38

标签: python pandas conditional percentile

我有以下具有百分位数的数据框,我想将0-9之间的值分配给各自的百分位数。

这是输入:

         a
 1  0.3038
 2  0.0572
 3  0.1153
 4  0.2168
 5  0.5688
 6  0.6291
 7  0.9416
 8  0.7438
 9  0.2242
10  0.5662

这是理想的输出:

         a  b
 1  0.3038  3
 2  0.0572  0
 3  0.1153  1
 4  0.2168  2
 5  0.5688  5
 6  0.6291  6
 7  0.9416  9
 8  0.7438  7
 9  0.2242  2
10  0.5662  5

另外,如果列中的值为' a'是1.00我想返回值9。 例如:

        a   b
1  1.0000   9

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

更新了解决方案

感谢@Peter Leimbigler在评论中提出以下建议,以确保正确处理1.0映射到9的要求:

np.floor(df['a']*10).replace({10:9})

或者,坚持上一个解决方案中存在的clip_upper()想法:

np.floor(df.clip_upper(0.9) * 10).astype(int)
上述解决方案中的

0.9实际上可以是任意数字[0.9, 1),并且可以按预期工作。之前的解决方案中的问题是此处使用了1,这意味着精确1.0的值未向下舍入。

我将保留下面的原始解决方案,因为它已被OP接受,但正如@Peter Leimbigler指出的那样,它没有正确处理1.0 - > 9特例。

以前的解决方案

如果我理解正确:

df['b'] = np.floor(df.clip_upper(1) * 10).astype(int)

与问题和结果相同的结果给出了关于正好为1的数字的警告。

         a  b
1   0.3038  3
2   0.0572  0
3   0.1153  1
4   0.2168  2
5   0.5688  5
6   0.6291  6
7   0.9416  9
8   0.7438  7
9   0.2242  2
10  0.5662  5