我正在处理的数据看起来像 DataFrame 描述的
df = pd.DataFrame({'AAA': [1,1,1,2,2,2,3,3], 'BBB': [2,1,3,4,6,1,2,3]})
我想要做的是,如果值超过第 90 个百分位数,则将值设置为向上舍入 (90%)。所以这就像将最大值限制在第 90 个百分位数。
这对我来说变得越来越棘手,因为每一列都会有不同的百分位值。
我可以使用以下方法获得第 90 个百分位值:
df.describe(percentiles=[.9])
因此,对于 BBB 列,6 大于 4.60(第 90 个百分位),因此需要更改为 5(向上舍入 4.60)。
在我的实际问题中,我正在为一个大矩阵执行此操作,因此我想知道是否有任何简单的解决方案,而不是首先创建列的第 90 个百分位数的数组,然后检查列中的元素并将它们设置为向上舍入到第 90 个百分位。
最佳答案
一种矢量化方法是将 np.minimum
结合起来和 df.quantile
:
>>> np.minimum(df, df.quantile(0.9))
AAA BBB
0 1 2.0
1 1 1.0
2 1 3.0
3 2 4.0
4 2 4.6
5 2 1.0
6 3 2.0
7 3 3.0
要获得更大的速度提升,请使用:
np.minimum(df, np.percentile(df, 90, axis=0))
df.quantile
似乎比 np.percentile
慢(可能是因为它返回一个 Series 而不是一个普通的 NumPy 数组)。
关于python - 将 DataFrame 中每列的值设置为第 90 个百分点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29892707/