Что такое правильный синтаксис при использовании .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()