#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