【问题标题】:Why does Category dtype not handle != NaN comparisons correctly?为什么 Category dtype 不能正确处理 != NaN 比较?
【发布时间】:2020-03-04 05:20:31
【问题描述】:

!= 比较中的行为似乎不一致,具体取决于项目是否属于类别。如果值在类别!= NaN 中,则返回False,这似乎与正常!= NaN 比较的评估方式不一致。当值不在类别中时,行为似乎是预期的。

import pandas as pd
import numpy as np

# Standard evaluation
'11' != np.NaN
#True

'A' != np.NaN
#True

s = pd.Series([np.NaN, '11']).astype('category')

s.ne('11')
#0    False   # <- What?
#1    False
#dtype: bool

s.ne('A')
#0    True
#1    True
#dtype: bool

# Without the category type the behavior is correct
pd.Series([np.NaN, '11']).ne('11')
#0     True
#1    False
#dtype: bool

这是一个错误,还是出于某种原因,类别中的预期 NaN 行为? pd.__version__ = 0.25.0,但也出现在1.0

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    原因似乎是NaNs 在处理 category 类型数据时的处理方式。对于分类数据,categories 中未包含的值将替换为 NaN,即 NaN 被视为不存在的类别。我们可以通过创建如下系列并指定现有类别来检查:

    c = pd.Categorical(values=['1','2',np.nan,'3','4'], categories=['1','2','3'])
    
    print(c)
    [1, 2, NaN, 3, NaN]
    Categories (3, object): [1, 2, 3]
    

    通过检查docs,我们看到:

    缺失值不应包含在分类的类别中,只能包含在值中。相反,据了解 NaN 是不同的,并且总是有可能

    因此,与现有类别中的值相比,缺失值始终被认为是一种可能性。

    使用上面的示例,我们可以看到相同的行为,缺少值NaN 和不存在类别的值'4'

    c != '3'
    array([ True,  True, False, False, False])
    

    【讨论】:

    • 我知道我一直在玩它,我也对此感到很困惑。也许出于某种原因,明确的相等比较没有显示这种行为?我不确定...-
    • 不,我想我明白你在说什么。这很有帮助。我想我可能会停止使用分类,因为这会使我的一些比较变得非常复杂。 :D
    • 嗯,这就是我能找到的尽可能多的挖掘,希望它有所帮助:) @ALollz
    猜你喜欢
    • 2019-05-21
    • 2015-05-17
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2017-10-25
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多