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

Assign multiple conditional values to percentiles into a new pandas column

我有以下带有百分位数的数据框,我想将 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,我想 return 值 9。 例如:

        a   b
1  1.0000   9

感谢您的帮助。

更新解决方案

感谢@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