我具有以下格式的数据框:
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
。
当变量Expression
位于表达式列中字符串的左侧时,我想过滤i
列为true的数据框。
例如,第一行的值为3<10
为真。
我想要的结果数据框是:
Name Factor Expression Year
Hydro 0.075 <10 2010
Hydro 0.075 <10 2011
Hydro 0.075 <10 2012
谢谢您的帮助。
答案 0 :(得分:2)
Pandas的safer version of eval
支持有限数量的操作。幸运的是,>
和<
可以工作,您可以将其与字符串串联一起使用:
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指出的那样,上述方法仅适用于<
100行*的DataFrame,这不是理想的选择。他还提出了以下解决方案:
df[[pd.eval(f"{i}{j}") for j in df['Expression']]]
*在以下问题中更深入地讨论了上述限制:AttributeError: 'PandasExprVisitor' object has no attribute 'visit_Ellipsis', using pandas eval