我遇到了一个奇怪的情况,pd.describe 给我的百分位数标记与 scipy.stats percentileofscore 不一致,我认为是因为 NaN。
我的 df 是:
f_recommend
0 3.857143
1 4.500000
2 4.458333
3 NaN
4 3.600000
5 NaN
6 4.285714
7 3.587065
8 4.200000
9 NaN
当我跑步时df.describe(percentiles=[.25, .5, .75])
I get:
f_recommend
count 7.000000
mean 4.069751
std 0.386990
min 3.587065
25% 3.728571
50% 4.200000
75% 4.372024
max 4.500000
当我删除 NaN 运行时,我得到相同的值。
但是,当我想查找特定值时,当我运行时scipy.stats.percentileofscore(df['f_recommend'], 3.61, kind = 'mean')
我得到:有 NaN 的第 28 个百分位,没有 NaN 的第 20 个百分位。
有什么想法可以解释这种差异吗?
ETA:
我不认为问题在于我们计算百分位数的方式不同。因为只有当您以不同的方式计算相同的两个数字的百分位数时,这才重要。但在这里,describe 给出的 25 个百分位为 3.72。所以 3.61 绝对不可能是第 28 个百分位。没有一个公式可以给出这一点。
特别是,当我对不带 NaN 的 6 个值使用描述时,我得到相同的值,因此忽略 NaN,这很好。但是当我在没有 NaN 的情况下运行分数百分位时,我得到一个不匹配的数字。
ETA 2:
更简单的例子:
In [48]: d = pd.DataFrame([1,2,3,4,5,6,7])
In [49]: d.describe()
Out[49]:
0
count 7.000000
mean 4.000000
std 2.160247
min 1.000000
25% 2.500000
50% 4.000000
75% 5.500000
max 7.000000
In [50]: sp.stats.percentileofscore(d[0], 2.1, kind = 'mean')
Out[50]: 28.571428571428573
“kind”参数并不重要,因为 2.1 是唯一的。