计算列中值的百分位数

时间:2017-06-29 12:18:00

标签: python pandas statistics distribution

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

4 个答案:

答案 0 :(得分:2)

要查找相对于数组的值的百分位数(或者在数据框列中),请使用scipy函数stats.percentileofscore()

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

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

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

有关差异的示例:

>>> 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百分位数。有关详细信息,请参阅this Wikipedia article

答案 1 :(得分:2)

由于您要查找特定阈值之上/之下的值,因此可以考虑使用熊猫 qcut 函数。如果希望值小于20%且大于80%,则将数据分为5个大小相等的分区。每个分区代表相等大小的20%“块”(五个20%分区为100%)。因此,给定一个具有1列“ a”的DataFrame,该列表示您具有以下数据的列:

df['newcol'] = pd.qcut(df['a'], 5, labels=False)

这将为您的DataFrame提供一个新列,每一行的值都在(0,1,2,3,4)中。其中0代表您的最低20%,4代表您的最高20%,即80%。

答案 2 :(得分:1)

对列进行排序,并查看该值是否在前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

答案 3 :(得分:0)

可能很晚了,但仍然

df['column_name'].describe()

将为您提供常规的25%,50%和75%百分位数以及一些其他数据 但是如果您特别希望百分位数为某些特定值,那么

df['column_name'].describe(percentiles=[0.1, 0.2, 0.3, 0.5])

这将为您提供第10、20、30和50个百分位。 您可以根据需要提供任意多个值。