Задачка решается 1 короткой строкой, ограничений на типы данных во фрейме нет:
df = df[df.isna().sum(axis=1).eq(2)]
Сначала делаем булев массив df.isna()
- где NaN, будет True. Суммируем построчно sum(axis=1)
- True суммируются как единицы. Потом проверяем полученные суммы на равенство 2-м eq(2)
- и получаем булев массив, где в удаляемых строках будет False. После чего фильтруем df[...]
Полный пример с генерацией фрейма:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,10,5*10).reshape(-1,5)).replace({1:np.NaN,2:np.NaN,5:'aaa'})
print('Было\n',df)
df = df[df.isna().sum(axis=1).eq(2)]
print('Стало\n',df)
Было
0 1 2 3 4
0 4.0 3.0 NaN 9.0 NaN
1 8.0 NaN 3.0 0.0 9.0
2 4.0 NaN 4.0 NaN 4.0
3 8.0 aaa NaN NaN NaN
4 4.0 aaa 9.0 9.0 aaa
5 6.0 0.0 6.0 NaN 8.0
6 NaN 8.0 aaa 9.0 NaN
7 4.0 0.0 NaN 0.0 NaN
8 0.0 NaN 3.0 6.0 3.0
9 aaa aaa NaN 6.0 7.0
Стало
0 1 2 3 4
0 4.0 3.0 NaN 9.0 NaN
2 4.0 NaN 4.0 NaN 4.0
6 NaN 8.0 aaa 9.0 NaN
7 4.0 0.0 NaN 0.0 NaN