我有一个数据框,其中包含一个具有数值的列。该列不能通过正态分布很好地近似。给定另一个数值,不在此列中,如何计算列中的百分位数?也就是说,如果该值大于列中值的80%但小于其他20%,则它将在第20个百分位中。
答案 0 :(得分:2)
要查找相对于数组的值的百分位数(或者在数据框列中),请使用scipy函数stats.percentileofscore()
。
例如,如果我们有值x
(不在数据框中的其他数值)和参考数组arr
(数据框中的列),我们可以找到百分位数x
by:
from scipy import stats
percentile = stats.percentileofscore(arr, x)
请注意,stats.percentileofscore()
函数的第三个参数会对百分位数的结果值产生重大影响,即。 kind
。您可以选择rank
,weak
,strict
和mean
。有关详细信息,请参阅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个百分位。 您可以根据需要提供任意多个值。