滚动百分位数 - 熊猫

Posted

技术标签:

【中文标题】滚动百分位数 - 熊猫【英文标题】:Rolling Percentile - Pandas 【发布时间】:2022-01-16 13:49:37 【问题描述】:

这给出了下面一列的百分比值,

df[column].rank(pct=True)

但是有没有办法通过使用这种类似的方法来获取列的滚动百分位值,而无需编写函数或循环和更长的代码?目前在添加.rolling(window)时,它不起作用。

如果没有,Pandas 迫切需要将其添加为 .rolling() 的功能,.quantile() 有此功能,百分位数也没有它是没有意义的。

【问题讨论】:

Rolling rank 将是 added in 1.4.0。目前没有帮助,因为它尚未发布,但即将发布,可能可供本问答的未来访问者使用。 但是知道这对以后的使用来说真的很好,非常感谢。 【参考方案1】:

在等待在 pandas 1.4.0 中添加滚动排名时,执行此操作的一种方法可能是:

import pandas as pd

df[column].rolling(window).apply(lambda x: len(x[x <= x.iloc[-1]]) / len(x))

window 是您试图滚动的window。这应该会给您与在等于手头窗口的数据帧上使用 df[column].rank(pct=True) 相同的结果。

lambda 函数将低于或等于最后一个值的出现次数除以值的总数,得出分数低于当前行的百分比。

注意:窗口大小下的值将返回NaN。例如window=2 的第一个值。


例子:

n = [5, 10, 9, 7, 6, 9, 4]
df = pd.DataFrame(n, columns=['Scores'])
df['rank_result'] = df['Scores'].rank(pct=True)
df['rolling_apply'] = df['Scores'].rolling(7).apply(lambda x: len(x[x <= x.iloc[-1]]) / len(x))
print(df[6:7]) # get the last row to compare

这将为最后一行提供以下输出:

   Scores  rank_result  rolling_apply
6       4     0.142857       0.142857

【讨论】:

您好,感谢您提供的替代方案。但是您使用 Lambda 函数的方式是这样做的。我现在已经尝试使用常规函数并使用 apply ()。但是当我运行代码时,它会在列中输出 0。由于我无法将代码以可读的代码格式放在评论部分,并且与我发布的原始问题略有不同,因此我为此发布了另一个问题。查看以下链接,***.com/q/70358306/5315363 好的,我去看看!

以上是关于滚动百分位数 - 熊猫的主要内容,如果未能解决你的问题,请参考以下文章

如何获得熊猫数据框中一行的百分位数?

使用百分位数从熊猫数据框中删除异常值

熊猫如何在数据框的相应列检查行的每个元素的百分位数

熊猫系列的分位数函数的倒数是啥?

python使用pandas中的groupby函数和agg函数计算每个分组数据的两个分位数(例如百分之10分位数和百分之90分位数)

获得滚动百分位数排名的快速方法