我有一个数据框,其中有一列包含数值。该列不能很好地近似于正态分布。给定另一个数值,不在该列中,我如何计算其在该列中的百分位数?也就是说,如果该值大于该列中值的80%,但小于其他20%,则它将位于第20个百分位数。
jucafojl1#
要查找某个值相对于数组(在本例中是数据框列)的百分位数,请使用scipy函数stats.percentileofscore()。例如,如果我们有一个值x(不在 Dataframe 中的另一个数值)和一个引用数组arr(来自 Dataframe 的列),我们可以通过以下方式找到x的百分位数:
stats.percentileofscore()
x
arr
from scipy import stats percentile = stats.percentileofscore(arr, x)
请注意,stats.percentileofscore()函数还有第三个参数对百分位数的结果值有显著影响,即kind。您可以从rank、weak、strict和mean中选择。有关详细信息,请参阅docs。关于差异的示例:
kind
rank
weak
strict
mean
>>> 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。
u3r8eeie2#
可能很晚了但还是
df['column_name'].describe()
我会给予你常规的25,50和75百分位数与一些额外的数据,但如果你想百分位数为一些特定的价值观,然后
df['column_name'].describe(percentiles=[0.1, 0.2, 0.3, 0.5])
这将给予你第10,20,30和50百分位数。你可以给尽可能多的值,因为你想。结果对象可以像dict一样访问:
desc = df['column_name'].describe(percentiles=[0.1, 0.2, 0.3, 0.5]) print(desc) print(desc['10%'])
ukdjmx9f3#
对列进行排序,并查看值是否在前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:
searchsorted
my_series.values.searchsorted(val)/len(my_series)*100
dkqlctbz4#
由于您正在查找超过/低于特定阈值的值,因此可以考虑使用pandas***qcut***函数。如果您想要20%以下和80%以上的值,请将数据分为5个大小相等的分区。每个分区将代表大小相等的20%“块”(五个20%的分区就是100%)。因此,给定一个DataFrame,其中有1列'a',它表示您有数据的列:
df['newcol'] = pd.qcut(df['a'], 5, labels=False)
这将为DataFrame给予一个新列,每行都有一个值(0,1,2,3,4)。其中0表示最低的20%,4表示最高的20%,即80%。
4条答案
按热度按时间jucafojl1#
要查找某个值相对于数组(在本例中是数据框列)的百分位数,请使用scipy函数
stats.percentileofscore()
。例如,如果我们有一个值
x
(不在 Dataframe 中的另一个数值)和一个引用数组arr
(来自 Dataframe 的列),我们可以通过以下方式找到x
的百分位数:请注意,
stats.percentileofscore()
函数还有第三个参数对百分位数的结果值有显著影响,即kind
。您可以从rank
、weak
、strict
和mean
中选择。有关详细信息,请参阅docs。关于差异的示例:
最后需要注意的是,如果您的值大于列中其他值的80%,则它将位于第80个百分位数(参见上面的示例,了解
kind
方法如何影响最终得分),而不是第20个百分位数。有关详细信息,请参阅this Wikipedia article。u3r8eeie2#
可能很晚了但还是
我会给予你常规的25,50和75百分位数与一些额外的数据,但如果你想百分位数为一些特定的价值观,然后
这将给予你第10,20,30和50百分位数。你可以给尽可能多的值,因为你想。
结果对象可以像dict一样访问:
ukdjmx9f3#
对列进行排序,并查看值是否在前20%或其他百分比内。
例如:
或者,如果你想要实际的百分位数,只需使用
searchsorted
:dkqlctbz4#
由于您正在查找超过/低于特定阈值的值,因此可以考虑使用pandas***qcut***函数。如果您想要20%以下和80%以上的值,请将数据分为5个大小相等的分区。每个分区将代表大小相等的20%“块”(五个20%的分区就是100%)。因此,给定一个DataFrame,其中有1列'a',它表示您有数据的列:
这将为DataFrame给予一个新列,每行都有一个值(0,1,2,3,4)。其中0表示最低的20%,4表示最高的20%,即80%。