计算列中值的百分位数
Posted
技术标签:
【中文标题】计算列中值的百分位数【英文标题】:Calculate percentile of value in column 【发布时间】:2017-12-03 03:25:36 【问题描述】:我有一个数据框,其中有一列具有数值。该列不能很好地近似于正态分布。给定另一个数值,不在此列中,我如何计算它在列中的百分位数?也就是说,如果该值大于列中值的 80% 但小于其他 20%,则它将位于第 20 个百分位。
【问题讨论】:
嘿,将接受的答案更改为最受好评的答案会非常有用,因为它更加完整并且具有或多或少标准化的计算方法新值的百分位数。 【参考方案1】:可能很晚,但仍然
df['column_name'].describe()
将为您提供常规的 25、50 和 75 个百分位数以及一些附加数据 但如果您特别想要某些特定值的百分位数,那么
df['column_name'].describe(percentiles=[0.1, 0.2, 0.3, 0.5])
这将为您提供第 10、第 20、第 30 和第 50 个百分位数。 您可以提供任意数量的值。
【讨论】:
【参考方案2】:由于您正在寻找超过/低于特定阈值的值,您可以考虑使用 pandas 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% 的百分位数。
【讨论】:
【参考方案3】:要查找相对于数组(或在您的情况下为数据框列)的值的百分位数,请使用 scipy 函数 stats.percentileofscore()
。
例如,如果我们有一个值x
(另一个不在数据框中的数值)和一个引用数组arr
(来自数据框的列),我们可以找到x
的百分位数作者:
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 了解更多信息。
【讨论】:
【参考方案4】:对列进行排序,并查看该值是否在前 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
【讨论】:
这样我必须遍历所有可能的百分位数以找出新值所在的百分位数。以上是关于计算列中值的百分位数的主要内容,如果未能解决你的问题,请参考以下文章
python使用pandas中的groupby函数和agg函数计算每个分组数据的两个分位数(例如百分之10分位数和百分之90分位数)
Pandas .. 分位数函数是不是需要排序数据来计算百分位数?