Python - Pandas - describe() 方法的百分位数计算公式是什么?

1 投票
2 回答
44 浏览
提问于 2025-04-14 16:37

有人能解释一下describe()方法是怎么计算百分位数的吗?

不同的资料用不同的方法来解释这个问题。那么,具体的计算方式是什么呢?

比如,看看下面这段代码:

l=[10,13,15,19,21,25]
s=pd.Series(l)
s.describe()

输出结果是:

count     6.000000
mean     17.166667
std       5.528713
min      10.000000
**25%      13.500000**
50%      17.000000
75%      20.500000
max      25.000000

有人能解释一下25%(也就是第一四分位数Q1)是怎么计算出来的吗?

2 个回答

0

这个内容在quantile的文档中有说明(默认情况下,插值是线性的):

线性插值的公式是:i + (j - i) * (x-i)/(j-i)

其中,(x-i)/(j-i) 是被 i 和 j 包围的索引的分数部分。

i 是通过 interpolation='lower' 得到的,而 j 是通过 interpolation='higher' 得到的。

所以在这里 i = 13 ; j = 15 ; (x-i)/(j-i) = 0.25

13 + (15 - 13) * 0.25 = 13.5
1

我在这里找到了一些解释:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.quantile.html

df.quantile()这个函数有几个参数,可以用来计算不同插值方式下的分位数。对于df.describe(),默认使用的方式似乎是线性插值,具体可以参考这里:

s.quantile([.25, .5, .75], interpolation="linear")

这段代码的结果是:

0.25    13.5
0.50    17.0
0.75    20.5

你也可以使用:

s.quantile([.25, .5, .75], interpolation="nearest")

来得到:

0.25    13
0.50    15
0.75    21

"nearest"(最近邻)是我也期待的结果。根据文档,线性插值的公式是:

线性插值:i + (j - i) * fraction,其中fraction是夹在i和j之间的索引的小数部分。

撰写回答