Использование boolean indexing
:
df = df[~df['A'].duplicated(keep=False) | df[['B','C']].notnull().any(axis=1)]
print (df)
A B C
0 foo 2.0 3.0
2 foo 1.0 4.0
3 bar NaN NaN
Пояснение :
Тестовая колонка A
для неповторяющихся - duplicated
с ~
для инвертированной логической маски:
print (~df['A'].duplicated(keep=False))
0 False
1 False
2 False
3 True
4 False
Name: A, dtype: bool
Проверка не пропущенных значений в столбцах B,C
:
print (df[['B','C']].notnull())
B C
0 True True
1 False False
2 True True
3 False False
4 False False
И затем по крайней мере один True в строкес DataFrame.any
:
print (df[['B','C']].notnull().any(axis=1))
0 True
1 False
2 True
3 False
4 False
dtype: bool
Цепочка по |
для побитового OR
:
print (~df['A'].duplicated(keep=False) | df[['B','C']].notnull().any(axis=1))
0 True
1 False
2 True
3 True
4 False
dtype: bool