【问题标题】:Does the quantile() function in Pandas ignore NaN?Pandas 中的 quantile() 函数是否忽略 NaN?
【发布时间】:2019-02-09 18:50:06
【问题描述】:

我有一个 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)

因此,我得到的是分位数函数是否/如何解决 NaN 的问题?

【问题讨论】:

  • 好吧,如果你通过skipna=True,我猜它会跳过它们。
  • 如果你没有通过 skipna=True ,也就是说,如果它有 nan ,它将返回 nan
  • 别问我们;我们是生物单位。尝试一下,看看会发生什么。加载具有一半 NaN 值的 df 并播放几分钟。
  • 关于生成 A、B 的方式的旁注。你可以只 A = np.random.randint(100, size=10)
  • Docs 没有对skipnan 的分位数函数的引用,这就是我问的原因.. DataFrame.quantile(q=0.5, axis=0, numeric_only=True, interpolation='linear') @ sacul 好心地在 np.nanpercentile 中突出显示了我不知道存在的正确比较器,谢谢大家

标签: python pandas quantile


【解决方案1】:

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

>>> 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])

看看它们是等价的

【讨论】:

    【解决方案2】:

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

    为了证明这一点,我们可以将其与np.nanquantile 进行比较,后者计算数据沿指定轴的第 q 个分位数,同时忽略 nan 值[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.])
    

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 2021-06-15
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2017-09-26
      • 2021-05-21
      相关资源
      最近更新 更多