Передача операторов в качестве функций для использования с фреймами данных 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)