Что такое правильный синтаксис при использовании .notnull() в Pandas?

Я хочу использовать .notnull() в нескольких столбцах блока данных для исключения строк, содержащих значения "NaN".

Скажем, у меня есть следующий df:

  A   B   C
0 1   1   1
1 1   NaN 1
2 1   NaN NaN
3 NaN 1   1

Я пытался использовать этот синтаксис, но он не работает? Знаете ли вы, что я делаю неправильно?

df[[df.A.notnull()],[df.B.notnull()],[df.C.notnull()]]

Я получаю эту ошибку:

TypeError: 'Series' objects are mutable, thus they cannot be hashed

Что делать, чтобы получить следующий вывод?

  A   B   C
0 1   1   1

Любая идея?

Ответ 1

Сначала вы можете выбрать подмножество столбцов с помощью df[['A','B','C']], затем применить notnull и указать, являются ли значения all в маске True:

print (df[['A','B','C']].notnull())
       A      B      C
0   True   True   True
1   True  False   True
2   True  False  False
3  False   True   True

print (df[['A','B','C']].notnull().all(1))
0     True
1    False
2    False
3    False
dtype: bool

print (df[df[['A','B','C']].notnull().all(1)])
     A    B    C
0  1.0  1.0  1.0

Другое решение из Ayhan комментария с dropna:

print (df.dropna(subset=['A', 'B', 'C']))
     A    B    C
0  1.0  1.0  1.0

что такое же как

print (df.dropna(subset=['A', 'B', 'C'], how='any'))

и означает удаление всех строк, где есть хотя бы одно значение NaN.

Ответ 2

Вы можете применить несколько условий, объединив их с оператором & (это работает не только для функции notnull()).

df[(df.A.notnull() & df.B.notnull() & df.C.notnull())]
     A    B    C
0  1.0  1.0  1.0

В качестве альтернативы вы можете просто удалить все столбцы, содержащие NaN. Исходный DataFrame не изменяется, вместо этого возвращается копия.

df.dropna()

Ответ 3

Вы можете просто сделать:

df.dropna()