Если вы не хотите изменять df
, я бы предложил избавиться от apply
и векторизовать это. Одним из вариантов является использование eval
.
u = df.assign(Latitude=df['Latitude'].str[:-1].astype(float))
u['Longitude'] = df['Longitude'].str[:-1].astype(float)
df[u.eval("24 < Latitude < 30 and 79 < Longitude < 87")]
У вас есть больше вариантов, используя Series.between
:
u = df['Latitude'].str[:-1].astype(float))
v = df['Longitude'].str[:-1].astype(float))
df[u.between(24, 30, inclusive=False) & v.between(79, 87, inclusive=False)]
Вот тот же код, преобразованный в boost::bind
заметьте y-combinator и его сайт приложения в основной функции. Я надеюсь, что это помогает.
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>
// Y-combinator compatible factorial
int fact(boost::function<int(int)> f,int v)
{
if(v == 0)
return 1;
else
return v * f(v -1);
}
// Y-combinator for the int type
boost::function<int(int)>
y(boost::function<int(boost::function<int(int)>,int)> f)
{
return boost::bind(f,boost::bind(&y,f),_1);
}
int main(int argc,char** argv)
{
boost::function<int(int)> factorial = y(fact);
std::cout << factorial(5) << std::endl;
return 0;
}
Можно ли объяснить как это все работы?
fix2 является y-combinator (а именно, это - combinator для функций с двумя аргументами; первым аргументом является функция (в целях рекурсии), вторым аргументом является "надлежащий" аргумент функции). Это создает рекурсивные функции.
bll:: мочите (...), кажется, создает некоторую форму функционального объекта, тело которого
if(second arg == 0)
{
return 1;
}
else
{
return second arg * first arg(second arg - 1);
}
"Ленивое" должно, по-видимому, там остановить бесконечное расширение первого (функционального) аргумента (чтение на различии между ленивым и строгим y combinators для наблюдения почему).
Код довольно ужасен. Анонимные функции хороши иметь, но хакерство для работы вокруг отсутствия C++ синтаксической поддержки делает их не стоящими усилия.