python - 根据python中的百分位数替换列值

标签 python pandas grouping percentile

我已经对一个数据框进行了分组,我希望每组替换某些列中的值(如果它们小于某个百分位数)。 因此,组内所有大于 0.95 百分位数的值都应替换为 0.95 百分位数,所有小于 0.05 百分位数的值都应替换为 0.05 百分位数。
数据框可能看起来像这样(取自 another question 的示例): 两组:“一”和“二”

    A           B           C
0   0.719391    0.091693    one
1   0.951499    0.83716     one
2   0.975212    0.224855    one
3   0.80762     0.031284    one
4   0.63319     0.342889    one
5   0.075102    0.899291    one
6   0.502843    0.773424    one
7   0.032285    0.242476    one
8   0.794938    0.607745    one
9   0.620387    0.574222    one
10  0.446639    0.549749    two
11  0.664324    0.134041    two
12  0.622217    0.505057    two
13  0.670338    0.99087     two
14  0.281431    0.016245    two
15  0.675756    0.185967    two
16  0.145147    0.045686    two
17  0.404413    0.191482    two
18  0.94913     0.943509    two
19  0.164642    0.157013    two

这个数据框的结果应该是:

A               B           C
0   0.719391    0.091693    one
1   0.951499    0.83716     one
2   0.96454115  0.224855    one
3   0.80762     0.05846805  one
4   0.63319     0.342889    one
5   0.075102    0.87133205  one
6   0.502843    0.773424    one
7   0.05155265  0.242476    one
8   0.794938    0.607745    one
9   0.620387    0.574222    one
10  0.446639    0.549749    two
11  0.664324    0.134041    two
12  0.622217    0.505057    two
13  0.670338    0.96955755  two
14  0.281431    0.02949345  two
15  0.675756    0.185967    two
16  0.15391975  0.045686    two
17  0.404413    0.191482    two
18  0.8261117   0.943509    two
19  0.164642    0.157013    two

请注意,A 列的第 2、7、16 和 18 行已被替换; B 列的第 3、5、13 和 14 行已被替换。

有谁知道如何以有效的方式对大型数据框执行此操作?

谢谢

最佳答案

你可以使用groupby + quantile + clip:

g = df.groupby('C').transform(lambda x: x.clip(*x.quantile([0.05, 0.95])))
g['C'] = df['C']

           A         B    C
0   0.719391  0.091693  one
1   0.951499  0.837160  one
2   0.964541  0.224855  one
3   0.807620  0.058468  one
4   0.633190  0.342889  one
5   0.075102  0.871332  one
6   0.502843  0.773424  one
7   0.051553  0.242476  one
8   0.794938  0.607745  one
9   0.620387  0.574222  one
10  0.446639  0.549749  two
11  0.664324  0.134041  two
12  0.622217  0.505057  two
13  0.670338  0.969558  two
14  0.281431  0.029493  two
15  0.675756  0.185967  two
16  0.153920  0.045686  two
17  0.404413  0.191482  two
18  0.826112  0.943509  two
19  0.164642  0.157013  two

完整性检查

np.allclose(e[['A', 'B']].values, g[['A', 'B']].values)
True

这里,e 是您问题中的输出。

关于python - 根据python中的百分位数替换列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187359/

相关文章:

python - Anaconda Jupyter Python2.7 "ImportError: No module named opencv"

Python如何用信号杀死阻塞在队列上的线程?

mysql - 如何选择两列中的不同行并对它们分别进行排序

python - 无法导入 rest_framework_simplejwt

python - 如何打印一个turtle()窗口?

python - 通过字符串变量 reshape 数据框

python - 将数值数据更改为分类数据 - Pandas

python - 更新其他列匹配条件但未按预期工作的列

javascript - 按值对 JSON 进行分组

drupal - 使用多个选项按字段对 Drupal View 进行分组 - 仅显示一个字段