Как при соединении n таблиц потом прописать условия для удаления строк?

В цикле соединяется n-ое количество csv файлов. В связи с этим образуются столбцы с похожими названиями отличающиеся суффиксами Пример полученной таблицы для n = 3:

id class count class_1 count_1 num_0_1 class_2 count_2 num_0_2 num_1_2
1 people 2 people 3 0.6 people 2 0.75 0.8
2 hare 2 hare 2 0.77 hare 2 0.86 0.83
3 people 2 empty 2 0.86 people 2 0.85 0.79

Из этой таблице необходимо удалить строки удовлетворяющие следующим условиям:

  1. Значения в столбцах class, class_1 ,class_2,...,class_(n-1) должны быть равны;

  2. Значения в столбцах count, count_1, count_2,..., count_(n-1) должны быть равны;

  3. Значения в столбцах num_0_1, num_0_2, num_1_2,..., num_(n-2)_(n-1) должны быть больше 0.7

Все эти условия должны выполняться одновременно для все столбцов

Так в примере должна получится следующая таблица:

id class count class_1 count_1 num_0_1 class_2 count_2 num_0_2 num_1_2
1 people 2 people 3 0.6 people 2 0.75 0.8
3 people 2 empty 2 0.86 people 2 0.85 0.79

Я могу вытащить названия столбцов в листы, так для столбцов содержащих num я это делаю следующим образом

    list_col = []
    
    for i in range(df.shape[1]):
        if 'num_' in df.columns[i]:
            list_col.append(df.columns[i])

Но как дальше прописать условия для этих столбцов и удалить строки придумать пока не получается


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

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

Для приведенного вами датафрейма можно сделать так:

n=3
res = df.loc[(df[df.filter(regex=fr"[class|count]_[^{n}]")
                 .nunique(axis=1)>2]
                 .filter(regex=fr"num_[^{n}]")>0.7).index]

res:

     class  count class_1  count_1  num_0_1 class_2  count_2  num_0_2  num_1_2
id                                                                            
1   people      2  people        3     0.60  people        2     0.75     0.80
3   people      2   empty        2     0.86  people        2     0.85     0.79

UPDATE

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

res = df.loc[df.filter(regex=r"[class|count]_").nunique(axis=1)>2]
res = res[res.filter(like=r"num_").apply(lambda x: x.le(0.7).all() , axis=1)]
→ Ссылка