Example DataFrame Values -
0 78
1 38
2 42
3 48
4 31
5 89
6 94
7 102
8 122
9 122
stats.percentileofscore(temp['INCOME'].values, 38, kind='mean')
15.0
stats.percentileofscore(temp['INCOME'].values, 38, kind='strict')
10.0
stats.percentileofscore(temp['INCOME'].values, 38, kind='weak')
20.0
stats.percentileofscore(temp['INCOME'].values, 38, kind='rank')
20.0
temp['INCOME'].rank(pct=True)
1 0.20 (Only showing the 38 value index)
temp['INCOME'].quantile(0.11)
37.93
temp['INCOME'].quantile(0.12)
38.31999999999999
Based on the results above, you can see none of the methods are consistent
with the pd.quantiles() method.
我需要获取数据帧(255M 行)中每一行的一列的百分位数,但找不到任何返回他们在 pd.quantile
& np.percentile
中使用的 “线性插值” 方法的函数/方法 ---
。
我尝试了以下方法/功能 -
.rank(pct=True)
此方法仅返回按顺序排列的值,而不是使用我正在寻找的百分位数方法。与 pd.quantiles
scipy.stats.percentileofscore
这种方法几乎更接近我正在寻找的方法,但由于某种原因仍然不是 100% 与“线性插值”方法一致。 与此问题相关的问题没有真正的答案
我已经查看了与此问题相关的每个 SO 答案,但它们都没有使用我需要使用的相同插值方法,因此请不要将其标记为重复,除非您可以验证它们使用的是相同的方法。
在这一点上,我最后的选择是只找到所有 100 个百分位数的 bin 截止值并以这种方式应用它或自己计算线性插值,但这似乎效率很低,并且将永远应用于 255M 记录。
还有其他建议吗?
谢谢!
原文由 bbennett36 发布,翻译遵循 CC BY-SA 4.0 许可协议
TL; DR
利用
回答
一旦您了解了机制,它实际上非常简单。当您寻找分数的百分位数时,您已经在每一行中有了分数。剩下的唯一一步是了解您需要 小于或等于 所选值的数字的百分位数。这正是 --- 的参数 kind=‘weak’ 和
scipy.stats.percentileofscore()
DataFrame.rank()
method=‘average’ 所做的。为了反转它,运行Series.quantile()
with interpolation=‘lower’ 。因此,
scipy.stats.percentileofscore()
、Series.rank()
和Series.quantile()
的行为 是 一致的,见下文:现在在一列
PCNT_RANK
你得到小于或等于一列中的值的比率INCOME
。但是如果你想要“插值”比率,它在列PCNT_LIN
中。当您使用Series.rank()
进行计算时,它非常快,可以在几秒钟内计算出 2.55 亿个数字。在这里,我将解释如何通过使用
quantile()
和linear
插值来获取值:我们的数据
temp['INCOME']
只有十个值。根据您 链接到 Wiki 的公式,第 11 个百分位数的排名是rank 的截断部分为1,对应值为31,rank为2(即next bin)的值为38
fraction
的值为 rank 的小数部分。这导致了结果:对于值本身,
fraction
部分必须为零,因此很容易进行逆计算以获得百分位数:我希望我说得更清楚。