Pandas 中的 quantile() 函数是否忽略 NaN?

Does the quantile() function in Pandas ignore NaN?

我有一个dfAB

import pandas as pd
import random

A = [ random.randint(0,100) for i in range(10) ]
B = [ random.randint(0,100) for i in range(10) ]

dfAB = pd.DataFrame({ 'A': A, 'B': B })
dfAB

我们可以采用分位数函数,因为我想知道列的第 75 个百分位数:

dfAB.quantile(0.75)

但是说现在我在 dfAB 中放入了一些 NaN 并重新执行函数,显然它是不同的:

dfAB.loc[5:8]=np.nan
dfAB.quantile(0.75)

基本上,当我计算 dfAB 的平均值时,我通过了 skipna 来忽略 Na,因为我不希望它们影响我的统计数据(我的代码中有很多,故意的,obv 使它们为零没有帮助)

dfAB.mean(skipna=True)

因此,我得到的是 whether/how 分位数函数地址为 NaN 的?

是的,这似乎是 pd.quantile 处理 NaN 值的方式。为了说明,您可以将结果与 np.nanpercentile 进行比较,后者明确 计算沿指定轴的数据的第 q 个百分位数, 同时忽略 nan 值 (引用自docs,我强调):

>>> dfAB
      A     B
0   5.0  10.0
1  43.0  67.0
2  86.0   2.0
3  61.0  83.0
4   2.0  27.0
5   NaN   NaN
6   NaN   NaN
7   NaN   NaN
8   NaN   NaN
9  27.0  70.0

>>> dfAB.quantile(0.75)
A    56.50
B    69.25
Name: 0.75, dtype: float64

>>> np.nanpercentile(dfAB, 75, axis=0)
array([56.5 , 69.25])

并且看到它们是等价的

pd.quantile() 将在计算分位数时忽略 NaN 值

为了证明这一点,我们可以将其与np.nanquantile, which compute the qth quantile of the data along the specified axis, while ignoring nan values[source]进行比较。

>>> random.seed(7)
>>> A = [ random.randint(0,100) for i in range(10) ]
>>> B = [ random.randint(0,100) for i in range(10) ]
>>> dfAB = pd.DataFrame({'A': A, 'B': B})
>>> dfAB.loc[5:8]=np.nan

>>> dfAB
      A     B
0  41.0   7.0
1  19.0  64.0
2  50.0  27.0
3  83.0   4.0
4   6.0  11.0
5   NaN   NaN
6   NaN   NaN
7   NaN   NaN
8   NaN   NaN
9  74.0  11.0

>>> dfAB.quantile(0.75)
A    68.0
B    23.0
Name: 0.75, dtype: float64

>>> np.nanquantile(dfAB, 0.75, axis=0)
array([68.  23.])