【发布时间】:2017-04-02 12:49:15
【问题描述】:
我遇到了一种奇怪的情况,我认为 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]) 时,我得到:
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') 时,我得到:第 28 个百分位数有 NaN,没有第 20 个百分位数。
有什么想法可以解释这种差异吗?
预计到达时间:
我不认为问题在于我们计算百分位数的方式不同。因为这仅在您以不同方式计算相同 2 个数字的百分位数时才重要。但在这里,describe 给出 25 个百分位数为 3.72。因此,3.61 绝对不可能是第 28 个百分位。没有一个公式应该给出这个。
特别是,当我在没有 NaN 的 6 个值上使用 describe 时,我得到相同的值,所以忽略 NaN,这很好。但是,当我在没有 NaN 的情况下运行分数百分位数时,我得到的数字不匹配。
预计到达时间 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 是独一无二的。
【问题讨论】:
-
我从来没有深入了解这一点,但我也看到了奇怪的行为,描述返回的平均值甚至不在基础数据的范围内。如果我真的很在意,我通常会直接对 numpy 数组进行操作以确保安全。
标签: python pandas scipy percentile