pandas 计算列中数值的百分位数

1sbrub3j  于 2023-04-19  发布在  其他
关注(0)|答案(4)|浏览(488)

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

jucafojl

jucafojl1#

要查找某个值相对于数组(在本例中是数据框列)的百分位数,请使用scipy函数stats.percentileofscore()
例如,如果我们有一个值x(不在 Dataframe 中的另一个数值)和一个引用数组arr(来自 Dataframe 的列),我们可以通过以下方式找到x的百分位数:

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

u3r8eeie

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%'])
ukdjmx9f

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

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

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%。

相关问题