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

标签 python pandas conditional-statements 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

感谢您的帮助。

最佳答案

更新的解决方案

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

关于python - 将多个条件值分配给新的 pandas 列中的百分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49501510/

相关文章:

python - Python 中+= 和append() 的区别

python - 编写使用 youtube-dl 仅提取下载链接的 python 脚本?

c++ - 有条件的 if 与 OR 检查所有条件

python - 在 Pandas 中将 csv 转换为 txt 时,电话号码中丢失 "+"

python - tensorflow map_fn TensorArray 具有不一致的形状

python - 将带有字典列表的字符串转换为 pandas df

python - 循环通过 URL 为 pandas 创建 csv 和数据框

python - 构建字典 - 列表长度不一样

javascript - if 语句的语法和运算符优先级

java - 返回 t == null ? -1 : t. 高度;做什么 ?和 : mean?