Удаление строк с определенными значениями атрибутов из DataFrame [duplicate]

Ваша функция 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{};
}

Вдохните из библиотеки стандартных алгоритмов .

1
задан MaxU 7 September 2016 в 20:45
поделиться

2 ответа

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

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
2
ответ дан Psidom 19 August 2018 в 15:34
поделиться
  • 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
  • 2
    @MaxU О том, чтобы добавить второй вариант. Да, я думаю, это лучший вариант. – Psidom 7 September 2016 в 20:49
  • 3
    @Psidom Спасибо, брату, который работает для меня. – Carlos Arronte Bello 7 September 2016 в 20:59

попробуйте следующее:

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
1
ответ дан MaxU 19 August 2018 в 15:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: