Существует по крайней мере несколько подходов к сокращению синтаксиса для этого в Pandas, пока он не получит полный API запросов в будущем (возможно, я попытаюсь присоединиться к проекту github и сделать это, если позволят время, и если никто еще уже началось).
Ниже приведен один способ немного сократить синтаксис:
inds = df.apply(lambda x: x["A"]>10 and x["B"]<5, axis=1)
print df[inds].to_string()
Чтобы полностью решить эту проблему, нужно создать что-то вроде SQL select и предложения where в Pandas. Это совсем не тривиально, но я думаю, что для этого можно использовать встроенный модуль Python operator
. Это позволяет вам воспринимать такие вещи, как «больше, чем», как функции вместо символов. Таким образом, вы можете сделать следующее:
def pandas_select(dataframe, select_dict):
inds = dataframe.apply(lambda x: reduce(lambda v1,v2: v1 and v2,
[elem[0](x[key], elem[1])
for key,elem in select_dict.iteritems()]), axis=1)
return dataframe[inds]
Тогда тестовый пример, подобный вашему, будет делать следующее:
import operator
select_dict = {
"A":(operator.gt,10),
"B":(operator.lt,5)
}
print pandas_select(df, select_dict).to_string()
Синтаксис можно сократить еще больше, добавив больше аргументов к pandas_select
для автоматической обработки различных общих логических операторов, либо импортировав их в пространство имен с более короткими именами.
Обратите внимание, что приведенная выше функция pandas_select
работает только с логическими цепочками и цепочками ограничений. Вы должны изменить его, чтобы получить другое логическое поведение. Или используйте not
и законы Деморгана.