在 Pandas 中至少有一些方法可以缩短它的语法,直到它得到一个完整的查询 API(也许我会尝试加入 github 项目,如果时间允许的话,如果没有其他人已经这样做了开始)。
下面给出了一种稍微缩短语法的方法:
inds = df.apply(lambda x: x["A"]>10 and x["B"]<5, axis=1)
print df[inds].to_string()
为了完全解决这个问题,需要在 Pandas 中构建 SQL select 和 where 子句之类的东西。这一点都不是微不足道的,但我认为可能适用的一种方法是使用 Pythonoperator
内置模块。这使您可以将大于之类的东西视为函数而不是符号。因此,您可以执行以下操作:
def pandas_select(dataframe, select_dict):
inds = dataframe.apply(lambda x: reduce(lambda v1,v2: v1 and v2,
[elem[0](x[key], elem[1])
for key,elem in select_dict.iteritems()]), axis=1)
return dataframe[inds]
然后像您这样的测试示例将执行以下操作:
import operator
select_dict = {
"A":(operator.gt,10),
"B":(operator.lt,5)
}
print pandas_select(df, select_dict).to_string()
pandas_select
您可以通过构建更多参数来自动处理不同的常见逻辑运算符,或者通过将它们导入具有较短名称的命名空间来进一步缩短语法。
请注意,pandas_select
上面的函数仅适用于逻辑和约束链。您必须对其进行修改以获得不同的逻辑行为。或者使用not
和德摩根定律。