python - 将 DataFrame 中每列的值设置为第 90 个百分点

标签 python pandas dataframe vectorization percentile

我正在处理的数据看起来像 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/

相关文章:

python - 类型错误 : 'type' object has no attribute '__getitem__'

python - 在Python中返回反向列表

pythonbrew bashrc awk 行不再有效

python - 如何摆脱 Pandas 中的第二个索引列? (Python)

进行 groupby 计数时出现 python pandas 错误

python - 如何从 Python 日期时间获取可识别时区的年、月、日、小时等?

Python nose 关键测试与非关键测试

python - 枚举具有相同前缀的列

python - 我可以使用 Pandas 的 pivot_table 聚合缺失值的列吗?

r - 在数据帧中成对计算有效观测值的数量(无NA)