用户定义的pandas数据帧过滤器

时间:2014-06-22 16:11:13

标签: numpy pandas filtering logical-operators sympy

我写了一个基于Qt的应用程序,显示表格数据。该应用程序使用pandas数据帧来存储信息。用户应该能够过滤数据帧,e.x。:

df = pandas.DataFrame({
   'elevation': [10, 20, 15, 12, 100, 150, 200, 200],        
   'name': ['tree', 'tree', 'house', 'tree', 'house']
})
df[(elevation > 10) & (elevation < 200)]
df[(elevation > 10) & (elevation < 200) & (name == 'tree')]

我如何从文本输入构建这样的过滤函数? 我尝试使用SymPy将函数从文本输入转换为稍后lambdify。

expr = sympify("(x > 10) & (x < 200)")
f = lambdify(x, expr, "numpy")
f(df)

如果我使用数据帧作为输入,我得到错误&#34;系列的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()&#34;。 如果我使用它与df.any()我得到一个真或假回来,但没有索引系列... 对于简单的x> 10个表达方式,它按预期工作,或更好地说,如所希望的那样。 有什么建议吗?

1 个答案:

答案 0 :(得分:2)

在这种情况下,您可以利用query

>>> df.query("(elevation > 10) & (elevation < 200)")
   elevation   name
1         20   tree
2         15  house
3         12   tree
4        100  house
5        150   tree
>>> df.query("(elevation > 10) & (elevation < 200) & (name == 'tree')")
   elevation  name
1         20  tree
3         12  tree
5        150  tree

query无法处理所有事情,但它可以处理这么简单的事情。如果您需要更复杂的东西,可以使用execeval来动态构建函数;那里存在明显的安全隐患,但您使用sympy时会遇到同样的问题(它也使用eval。)

或者,您可以根据需要简单地实现自己的解析器。

相关问题