将数组转换为百分位数

Chr*_*ris 4 python numpy percentile

我有一个要转换为百分位数的数组。例如,假设我有一个正态分布的数组:

import numpy as np
import matplotlib.pyplot as plt

arr = np.random.normal(0, 1, 1000)
plt.hist(arr)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

对于该数组中的每个值,我想计算该值的百分位数(例如0是上述分布的第50个百分位数,所以0-> 0.5)。由于每个百分位数应具有相等的权重,因此结果应均匀分布。

在此处输入图片说明

我发现了,np.percentile但此函数返回给定数组和分位数的值,而我需要的是返回给定数组和值的分位数

有相对有效的方法吗?

Mar*_*cos 9

实现此目的的方法有很多,具体取决于您要使用的库和您拥有的数据类型。

import numpy as np
# Input data
arr  = np.random.normal(0, 1, 10)
Run Code Online (Sandbox Code Playgroud)

scipy.stats.percentileofscore在 numpy 数组上使用:

from scipy import stats
np.vectorize(lambda x: stats.percentileofscore(arr, x))(arr)
Run Code Online (Sandbox Code Playgroud)

scipy.stats.rankdata在 numpy 数组或列表上使用:

from scipy import stats
stats.rankdata(arr, "average") / len(arr)
Run Code Online (Sandbox Code Playgroud)

pandas.DataFrame.rank在 Pandas DataFrame 上使用:

import numpy as np
df = pd.DataFrame(arr)
df.rank(pct=True)
Run Code Online (Sandbox Code Playgroud)


Max*_*wer 5

from scipy.stats import percentileofscore

# generate example data
arr = np.random.normal(0, 1, 10)

# pre-sort array
arr_sorted =  sorted(arr)

# calculate percentiles using scipy func percentileofscore on each array element
s = pd.Series(arr)
percentiles = s.apply(lambda x: percentileofscore(arr_sorted, x))
Run Code Online (Sandbox Code Playgroud)

检查结果是否正确:

df = pd.DataFrame({'data': s, 'percentiles': percentiles})    
df.sort_values(by='data')

       data   pcts
3 -1.692881   10.0
8 -1.395427   20.0
7 -1.162031   30.0
6 -0.568550   40.0
9  0.047298   50.0
5  0.296661   60.0
0  0.534816   70.0
4  0.542267   80.0
1  0.584766   90.0
2  1.185000  100.0
Run Code Online (Sandbox Code Playgroud)

  • 该数组也不需要排序,除非您希望以这种方式显示值。 (2认同)