Ваша функция binsearch
принимает указатель на функцию в качестве аргумента. lambda и указатель функций - это разные типы: лямбда может рассматриваться как экземпляр структуры, реализующей operator()
.
Обратите внимание, что безстоящие lambdas (lambdas, которые не захватить любую переменную) неявно конвертируются в указатель функции. Здесь неявное преобразование не работает из-за замены шаблона:
#include
template
void call_predicate(const T& v, void (*predicate)(T)) {
std::cout << "template" << std::endl;
predicate(v);
}
void call_predicate(const int& v, void (*predicate)(int)) {
std::cout << "overload" << std::endl;
predicate(v);
}
void foo(double v) {
std::cout << v << std::endl;
}
int main() {
// compiles and calls template function
call_predicate(42.0, foo);
// compiles and calls overload with implicit conversion
call_predicate(42, [](int v){std::cout << v << std::endl;});
// doesn't compile because template substitution fails
//call_predicate(42.0, [](double v){std::cout << v << std::endl;});
// compiles and calls template function through explicit instantiation
call_predicate(42.0, [](double v){std::cout << v << std::endl;});
}
Вы должны сделать свою функцию binsearch
более общей, например:
template
T binsearch(const std::vector &ts, Predicate p) {
// usage
for(auto& t : ts)
{
if(p(t)) return t;
}
// default value if p always returned false
return T{};
}
Вы также можете извлечь четыре интересующих вас столбца и подсчитать, сколько нулей для каждой строки и создать логический вектор для индексирования:
df[(df[['otc', 'tm', 'lease', 'maint']] == 0).sum(axis = 1) < 4]
# csr id ac otc tm lease maint
# 1 1 543 a 0 1 1 0
# 3 2 123 w 1 1 1 1
# 6 4 258 k 1 1 1 1
попробуйте следующее:
In [35]: df.eval('otc == 0 and tm == 0 and lease == 0 and maint == 0')
Out[35]:
0 True
1 False
2 True
3 False
4 True
5 True
6 False
7 True
dtype: bool
In [36]: df[~df.eval('otc == 0 and tm == 0 and lease == 0 and maint == 0')]
Out[36]:
csr id ac otc tm lease maint
1 1 543 a 0 1 1 0
3 2 123 w 1 1 1 1
6 4 258 k 1 1 1 1
df[~(df[['otc','tm','lease','maint']] == 0).all(1)]
илиdf[(df[['otc','tm','lease','maint']] != 0).any(1)]
– MaxU 7 September 2016 в 20:47