One вариант должен был бы использовать query
. Для условий в вашем вопросе это будет связано с построением строки по линиям 'A==5 & B==4 & C==2'
.
Чтобы настроить проблему, я собираюсь предположить, что вы предоставили список кортежей в форме (column, comparison, value)
в качестве условий, например ('A', '==', 5)
.
Тогда вы могли бы написать функцию вдоль линий:
def extract_matching_rows(df, conditions):
conditions = ' & '.join(['{}{}{}'.format(*c) for c in conditions])
return df.query(conditions)
Если вы заботитесь только о сравнениях равенства, можно просто жесткий код в '=='
и исключить его из вашего состояния кортежей.
Пример использования со слегка различными условиями:
conditions = [('A', '>=', 5), ('B', '==', 4), ('C', '<', 3)]
extract_matching_rows(df1, conditions)
A B C
0 5 4 2
Обратите внимание, что вы можете даже сравнить столбцы с query
:
conditions = [('B', '>=', 'C'), ('A', '==', 5)]
extract_matching_rows(df1, conditions)
A B C
0 5 4 2
1 5 2 2
3 5 1 1
спасибо @root, работает ли ваше решение, если вместо номера есть сравнение строк? – user308827
Да, но не очень просто. Строка запроса должна содержать в себе кавычки: ''A ==" yes "& B == 4''. Чтобы получить это, вам понадобятся кавычки в вашей строке, т. Е. Двойные кавычки в одинарных кавычках, определяющих вашу строку, или наоборот: '('A', '==', '' yes '')'. – root
В качестве альтернативы вы можете реализовать проверку внутри своей функции, чтобы определить, сравниваете ли вы со строкой, а затем форматируете свой запрос несколько иначе, если это так: '' {} {} "{}" '. Format (* c) ' , – root