isnull + all
Ваш синтаксис неверен.Вы можете использовать pd.DataFrame.isnull
:
mask1 = df['A'] > 0
mask2 = df[['B', 'C', 'D']].isnull().all(1)
df_1 = df_1[mask1 & mask2]
Аналогично, для вашего второго запроса:
mask1 = (df[['A', 'B']] > 0).all(1)
mask2 = df[['C', 'D']].isnull().all(1)
df_1 = df_1[mask1 & mask2]
Предполагается, что вы хотите явно фильтровать значения больше 0в mask1
.Если достаточно любого ненулевого числа, вы можете использовать pd.DataFrame.notnull
.
Не бойтесь таким образом разделить ваши маски на несколько строк.Это сделает ваш код более понятным и простым в управлении.
pipe + isnull + all
В более общем смысле вы можете написать функцию для вычисления и применения маски логического ряда:
def masker(df, cols_required):
""" Supply list cols_required. These must be > 0; others null. """
mask1 = (df[cols_required] > 0).all(1)
mask2 = df[df.columns.difference(cols_required)].isnull().all(1)
return df[mask1 & mask2]
df = df.pipe(masker, cols_required=['A', 'B'])