Фильтрация таблицы по условиям

Имеется следующая таблица

df = pd.DataFrame({'class1': ['a', 'b', 'c', 'a', 'a', 'c', 'a'],
                   'class2': ['y', 'x', 'z', 'w', 'y', 'x', 'z']})
df

необходимо удалить строки, если выполняется хотя бы одно из этих условий:

df['class1'].value_counts().loc[lambda x: x < 2]
df['class2'].value_counts().loc[lambda x: x < 2]

Oжидаемый результат

res = pd.DataFrame({'class1': ['a', 'c', 'a', 'c', 'a'],
                   'class2': ['y', 'z', 'y', 'x', 'z']})
res

Ответы (2 шт):

Автор решения: CrazyElf

Ну вот прямо "в лоб" решение. Возможно, можно и как-то короче записать было бы:

i1 = df['class1'].value_counts().loc[lambda x: x < 2].index
i2 = df['class2'].value_counts().loc[lambda x: x < 2].index

res = df.loc[~((df['class1'].isin(i1)) | (df['class2'].isin(i2)))]
res

Вывод:

class1  class2
0   a   y
2   c   z
4   a   y
5   c   x
6   a   z
→ Ссылка
Автор решения: D.Vinogradov

Как вариант:

df = pd.DataFrame({'class1': ['a', 'b', 'c', 'a', 'a', 'c', 'a'],
                   'class2': ['y', 'x', 'z', 'w', 'y', 'x', 'z']})

cols = ['class1', 'class2']

res = df[df[cols].replace(df[cols].stack().value_counts()).gt(1).all(1)]

>>> res

 class1 class2
0      a      y
2      c      z
4      a      y
5      c      x
6      a      z
→ Ссылка