У меня есть формат данных следующего формата:
Name Factor Expression Year
Hydro 0.075 <10 2010
Hydro 0.075 >10 2010
Hydro 0.075 <10 2011
Hydro 0.075 >10 2011
Hydro 0.075 <10 2012
И следующая переменная: i=3
.
Я хотел бы отфильтровать dataframe, где столбец Expression
оценивается как true, когда переменная i
находится в левой части строки в столбце выражения.
Например, первая строка будет оценивать значение true как 3<10
.
Результирующий ядро данных, которое мне бы хотелось:
Name Factor Expression Year
Hydro 0.075 <10 2010
Hydro 0.075 <10 2011
Hydro 0.075 <10 2012
Спасибо за любую помощь.
У Pandas есть более безопасная версия eval
которая поддерживает ограниченное количество операций. К счастью, >
и <
work, и вы можете использовать это вместе со конкатенацией строк:
i = '3'
idx = pd.eval(i + df.Expression)
df.loc[idx]
Name Factor Expression Year
0 Hydro 0.075 <10 2010
2 Hydro 0.075 <10 2011
4 Hydro 0.075 <10 2012
Как отметил @coldspeed, вышеупомянутый подход работает только с DataFrames, <
100 строк *, что не является идеальным. Он также предложил следующее решение:
df[[pd.eval(f"{i}{j}") for j in df['Expression']]]
* Вышеуказанное ограничение обсуждается более подробно в следующем вопросе: AttributeError: объект PandasExprVisitor не имеет атрибута "visit_Ellipsis", используя pandas eval
pd.eval
будет работать, только если ваш DataFrame имеет 100 строк или меньше.