Передача операторов в качестве функций для использования с фреймами данных Pandas

Я выбираю данные из серии на основе порога.

>>> s = pd.Series(np.random.randn(5))
>>> s
0   -0.308855
1   -0.031073
2    0.872700
3   -0.547615
4    0.633501
dtype: float64
>>> cfg = {'threshold' : 0 , 'op' : 'less' }
>>> ops = {'less' : '<', 'more': '>' , 'equal': '==' , 'not equal' : '!='}
>>> ops[cfg['op']]
'<'
>>> s[s < cfg['threshold']]
0   -0.308855
1   -0.031073
3   -0.547615
dtype: float64

Я хочу использовать ops[cfg['op']] в последней строке кода вместо '<'. Я готов изменить ключ, значения ops dict, если требуется (например, -lt вместо <). Как это можно сделать?

2 ответа

Решение

Я все об ответе @cᴏʟᴅsᴘᴇᴇᴅ и связанных вопросах и ответах @Zero...
Но вот альтернатива с numexpr

import numexpr as ne

s[ne.evaluate('s {} {}'.format(ops[cfg['op']], cfg['threshold']))]

0   -0.308855
1   -0.031073
3   -0.547615
Name: A, dtype: float64

Я снова открыл этот вопрос после того, как был закрыт как дубликат Как передать оператор в функцию python?

Вопрос и ответы отличные, и я выразил свою признательность с помощью голосов.

Спрашивая в контексте pandas.Series открывает его для использования ответов, которые включают numpy а также numexpr, Принимая во внимание, что попытка ответить на двойную цель этим ответом была бы чистой ерундой.

Определите словарь методов, которые могут заменить ваши операторы.

import operator    
d = {
         'more'  : operator.gt,
         'less'  : operator.lt,
         'equal' : operator.eq, 
         'not equal' : operator.ne
   }

Теперь просто внесите в свой словарь индекс и примените параметры вашей функции.

m = d[cfg['op']](s, cfg['threshold'])
m

0    False
1     True
2     True
3    False
4    False
dtype: bool

s[m]

1   -0.262054
2   -1.300810
dtype: float64

Вот,

d[cfg['op']](s, cfg['threshold']) 

Переводится на

operator.lt(s, 0)
Другие вопросы по тегам