计算列中值的百分位数

新手上路,请多包涵

我有一个数据框,其中有一列具有数值。此列未很好地近似于正态分布。给定另一个不在该列中的数值,我如何计算它在该列中的百分位数?也就是说,如果该值大于列中值的 80% 但小于其他 20%,则它将位于第 20 个百分位。

原文由 Bluefire 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

对列进行排序,并查看该值是否在前 20% 或任何百分位数内。

例如:

 def in_percentile(my_series, val, perc=0.2):
    myList=sorted(my_series.values.tolist())
    l=len(myList)
    return val>myList[int(l*perc)]

或者,如果您想要实际的百分位数,只需使用 searchsorted

 my_series.values.searchsorted(val)/len(my_series)*100

原文由 Binyamin Even 发布,翻译遵循 CC BY-SA 3.0 许可协议

要找到相对于数组(或在您的情况下为数据框列)的值的百分位数,请使用 scipy 函数 stats.percentileofscore()

例如,如果我们有一个值 x (不在数据框中的其他数值)和一个引用数组 arr (数据框中的列),我们可以找到 x 的百分位数:

 from scipy import stats
percentile = stats.percentileofscore(arr, x)

请注意, stats.percentileofscore() 函数的第三个参数对百分位数的结果值有重大影响,即。 kind 。您可以选择 rank , weak , strictmean 有关详细信息,请参阅 文档

有关差异的示例:

 >>> df
   a
0  1
1  2
2  3
3  4
4  5

>>> stats.percentileofscore(df['a'], 4, kind='rank')
80.0

>>> stats.percentileofscore(df['a'], 4, kind='weak')
80.0

>>> stats.percentileofscore(df['a'], 4, kind='strict')
60.0

>>> stats.percentileofscore(df['a'], 4, kind='mean')
70.0

最后一点,如果您的值大于列中其他值的 80%,则它将位于第 80 个百分位(请参阅上面的示例,了解 kind 方法如何影响此最终值分数有点)而不是第 20 个百分位数。有关详细信息,请参阅 此维基百科文章

原文由 wingr 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题