【问题标题】:Why does pd.Series([np.nan]) | pd.Series([True]) evaluate to False?为什么 pd.Series([np.nan]) | pd.Series([True]) 评估为 False?
【发布时间】:2020-05-26 15:59:03
【问题描述】:

为什么下面的代码会返回False

>>> pd.Series([np.nan]) | pd.Series([True])
0    False
dtype: bool

【问题讨论】:

  • 看起来像一个错误,因为交换收益率True。应该在他们的 github 中打开一个问题。
  • 这很有趣。请注意,np.nan or True 的计算结果为 nan,基本上,nan 将在您的操作中传播。 超级奇怪的是实际上 bool(np.nan) 将是True,更奇怪的是,pd.Series([np.nan],dtype=np.bool) 为您提供了一个带有单个True 的系列跨度>
  • @juanpa.arrivillaga 为了让故事更有趣,pd.NA(相对于np.nan)不会传播。
  • Here 的相关讨论来自 pandas GitHub 页面。
  • 确实很有趣,因为 np.logical_or(np.nan, True) 是真的。

标签: python pandas


【解决方案1】:

我认为这是因为np.nan 具有float 的元类,并且我猜想将__bool__ 覆盖为非零:

np.nan.__bool__() == True

同理:

>>>np.nan or None
nan

pandas 中的解决方案是:

pd.Series([np.nan]).fillna(False) | pd.Series([True])

编辑***

为清楚起见,在 pandas 0.24.1 方法中:_bool_method_SERIES 在线 1816.../pandas/core/ops.py 中有一个赋值:

    fill_bool = lambda x: x.fillna(False).astype(bool)

这是您描述的行为的来源。 IE。它经过专门设计,以便 np.nan 被视为 False 值(无论何时执行 or 操作)

【讨论】:

  • "...这样np.nan 被视为False 值(无论何时执行或操作)" - , np.nan 不被视为不同的东西,你自己试试np.nan or True,你会看到结果是np.nan
  • @MarianD - 嘿,我想我在上面提到过;但我的观点是pandas__or__ 操作期间用False 填充np.nan - 希望对您有所帮助。
  • 1. 抱歉,您没有引用任何内容(您的答案中没有链接;顺便说一句,为什么是 0.24.1 版?)。 2. 如果——正如你所说——“padnas 用False 填充np.nan”,为什么False or True 给出False(如OP 示例)?
  • 顺便说一句,您可以直接在答案中更具体。
【解决方案2】:

比较你的情况(用明确的dtype 强调推断的情况):

In[11]: pd.Series([np.nan], dtype=float) | pd.Series([True])
Out[11]: 
0    False
dtype: bool

有一个类似的(只有dtype 现在是bool):

In[12]: pd.Series([np.nan], dtype=bool) | pd.Series([True])
Out[12]: 
0    True
dtype: bool

你看出区别了吗?


解释:

  1. 在第一种情况下(你的),np.nan 在逻辑操作or 中传播自己(在后台)

    In[13]: np.nan or True
    Out[13]: nan
    

    在布尔运算结果的上下文中,pandas 将np.nan 视为False

     

  2. 在第二种情况下,输出是明确的,因为第一个系列有一个布尔值(True,因为所有非零值都被认为是True,包括np.nan,但这并不重要案例):

    In[14]: pd.Series([np.nan], dtype=bool)
    
    Out[14]: 
    0    True
    dtype: bool
    

    True or TrueTrue,当然:

    In[15]: True or True
    Out[15]: True
    

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2015-03-22
    • 1970-01-01
    • 2014-02-16
    • 2022-01-10
    • 2012-03-06
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多