Как при соединении 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 |
Из этой таблице необходимо удалить строки удовлетворяющие следующим условиям:
Значения в столбцах class, class_1 ,class_2,...,class_(n-1) должны быть равны;
Значения в столбцах count, count_1, count_2,..., count_(n-1) должны быть равны;
Значения в столбцах 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 шт):
Для приведенного вами датафрейма можно сделать так:
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)]