Функция построения запроса (логического значения) для pandas loc

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Существует df = pd.DataFrame({'A': [20, 51, 34, 41, 44]}) фрейм данных и dict, структурированный подобным {'A': {'operator': '<', 'value': 40}} образом, из которого мы хотим выбирать данные таким же образом, как это делает loc, для этого примера, который: df.loc[df['A'] < 40]

Мы можем попробовать это, создав строковый запрос:

 def build_query(set_values, df):
    query = ''
    for value in set_values:
        query = f"{query} and {value} {set_values[value]['operator']} {set_values[value]['value']}"
    return query[5:]
  

.query() а затем запустите ее с помощью df.query(build_query({'A': {'operator': '<', 'value': 40}}, df)) функции, подобной этой: .loc которая дает нам правильный выбор, но мы не можем манипулировать ею таким образом, как мы можем, df.query(build_query({'A': {'operator': '<', 'value': 40}}, df))['A'] = 0 поскольку, пытаясь установить значение этого конкретного выбора (выполнив), мы получаем: значение пытается быть установлено на копиифрагмент из фрейма данных.Можно перебирать результаты и назначать A, хотя для большого фрейма данных это занимает слишком много времени.

Есть ли способ заставить нас build_query работать .loc ?

Комментарии:

1. Можете ли вы использовать цикл for для выбора, а затем присвоить значение для ‘A’ таким образом?

2. Это возможно, хотя при большом фрейме данных это занимает слишком много времени. Я предпочитаю .loc

3. пожалуйста, поделитесь образцами данных с ожидаемым результатом. проще рассуждать и предлагать решение, если таковое имеется

Ответ №1:

IIUC вы можете использовать reduce и and_ связать свои условия с pd.eval :

 from operator import and_
from functools import reduce

d = {'A': {'operator': '<', 'value': 40}}

print (df.loc[reduce(and_, [df.eval(f'{k}{v.get("operator")}{v.get("value")}')
                           for k,v in d.items()])])

    A
0  20
2  34