Отрицание в условии np.select()

Вот мой код:

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"]))). Эта строка должна давать TRUE, когда и var1, и var2 не являются значением NaN. Проблема здесь с отрицанием, потому что с условиями без отрицания проблем нет.

Вопрос: Как исправить строку (not(pd.isna(df["var1"]))) & (not(pd.isna(df["var2"]))), чтобы в случае, когда и в var1, и в var2 не было NaN, условие должно было давать TRUE?


person vasili111    schedule 06.02.2020    source источник
comment
почему бы не использовать df.notna() вместо этого: conditions = [ (df["var1"].notna() & df['var2'].notna()), (pd.isna(df["var1"])) & (pd.isna(df["var2"]))]   -  person anky    schedule 06.02.2020
comment
@anky_91 Это сработало, спасибо. Это гораздо лучший способ для этого конкретного случая. Но мне также интересно, как правильно использовать отрицание для будущего использования. Что не так с моим отрицанием?   -  person vasili111    schedule 06.02.2020
comment
вы можете прочитать этот ответ, чтобы лучше объяснить, почему ваше отрицание не работает   -  person anky    schedule 06.02.2020
comment
stackoverflow.com/questions/36921951/   -  person AMC    schedule 09.02.2020


Ответы (1)


Пытаться:

conditions = [(~pd.isna(df["var1"]) & ~pd.isna(df["var2"])),
               (pd.isna(df["var1"]) &  pd.isna(df["var2"]))]
person Simon Rogers    schedule 06.02.2020
comment
Это сработало. Спасибо. какая разница между .values и без него? Какой способ лучше и почему? - person vasili111; 06.02.2020
comment
Также не могли бы вы предоставить какую-либо ссылку с объяснением оператора ~ (документация)? - person vasili111; 06.02.2020
comment
Спасибо. В чем преимущество использования массива вместо серии в этом случае? - person vasili111; 06.02.2020
comment
'.values' преобразует его из серии в массив (не обязательно). Подробнее о ~ см. здесь: wiki.python.org/moin/BitwiseOperators - person Simon Rogers; 06.02.2020