【问题标题】:Negation in np.select() conditionnp.select() 条件中的否定
【发布时间】:2020-05-22 17:53:47
【问题描述】:

这是我的代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({ 'var1': ['a', 'b', 'c',np.nan, np.nan],
                   'var2': [1, 2, np.nan , 4, np.nan]
                 })



conditions = [
    (not(pd.isna(df["var1"]))) & (not(pd.isna(df["var2"]))),
    (pd.isna(df["var1"])) & (pd.isna(df["var2"]))]

choices = ["No missing", "Both missing"]

df['Result'] = np.select(conditions, choices, default=np.nan)

输出:

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 1478, in __nonzero__
    f"The truth value of a {type(self).__name__} is ambiguous. "

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

问题出在(not(pd.isna(df["var1"]))) & (not(pd.isna(df["var2"]))) 行。当var1var2 不是NaN 值时,此行应该给出TRUE。这里的问题在于否定,因为没有否定的条件没有问题。

问题:如何纠正(not(pd.isna(df["var1"]))) & (not(pd.isna(df["var2"]))) 行,以防var1var2 都不是NaN 值,条件应该给出TRUE? p>

【问题讨论】:

  • 为什么不改用df.notna()conditions = [ (df["var1"].notna() & df['var2'].notna()), (pd.isna(df["var1"])) & (pd.isna(df["var2"]))]
  • @anky_91 成功了,谢谢。对于这种特殊情况,这是更好的方法。但我也对如何正确使用否定以备将来使用感兴趣。我的否定有什么问题?
  • 您可以阅读this 答案以更好地解释为什么您的否定不起作用

标签: python pandas numpy nan negation


【解决方案1】:

试试:

conditions = [(~pd.isna(df["var1"]) & ~pd.isna(df["var2"])),
               (pd.isna(df["var1"]) &  pd.isna(df["var2"]))]

【讨论】:

  • 那行得通。谢谢你。有.values 和没有它有什么区别?哪种方式更好,为什么?
  • 另外,您能否提供任何带有~操作员解释(文档)的链接?
  • 谢谢。这种情况下用数组代替Series有什么好处?
  • '.values' 将其从系列转换为数组(非必需)。有关“~”的更多信息,请参见此处:wiki.python.org/moin/BitwiseOperators
猜你喜欢
  • 2021-07-02
  • 2019-09-24
  • 2021-06-04
  • 1970-01-01
  • 2021-08-09
  • 2021-10-06
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
相关资源
最近更新 更多