在 Pandas 中至少有一些方法可以缩短它的语法,直到它得到一个完整的查询 API (也许我会尝试加入 github 项目并且这样做是时间允许的,如果没有的话else 已经开始了)。
下面给出了一种稍微缩短语法的方法:
inds = df.apply(lambda x: x["A"]>10 and x["B"]<5, axis=1)
print df[inds].to_string()
要完全解决这个问题,需要在 Pandas 中构建 SQL select 和 where 子句之类的东西。这一点都不是微不足道的,但我认为可能适用的一种方法是使用 Python operator 内置模块。这使您可以将大于之类的东西视为函数而不是符号。因此,您可以执行以下操作:
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 和德摩根定律。