选择查询所有列的条件满足

时间:2014-08-22 21:35:58

标签: python pandas numexpr

假设我在Pandas中有一个包含多个列的数据帧。我想选择数据框的子集,其中所有列位于两个值minmax之间。

如何使用query执行此操作?我是否需要在表达式中逐个指定每个列名:例如:

df.query('(A<{max} & A>{min}) & (B{min} & B{max}) & (C{min} & C{max})'.format(min,max))

除了查询,我还有其他选择吗?也许直接与满足条件的指数一起工作?

2 个答案:

答案 0 :(得分:4)

对于您的用例,我将使用非查询方式,构造一个布尔框架,然后调用.all方法:

>>> minval, maxval = 20, 80
>>> df = pd.DataFrame(np.random.randint(0, 100, (20,6)))
>>> df[((df > minval) & (df < maxval)).all(axis=1)]
     0   1   2   3   4   5
2   74  30  30  76  31  66
10  49  39  71  43  30  50

我认为手动构建扩展query的优势并不值得。

答案 1 :(得分:3)

我不确定您认为在这里需要query的原因。但如果你想这样做,你可以。您已经使用format语句动态构建查询字符串;通过加入理解,你只需要让它更多动态。例如:

qs = ' & '.join('{col}<{max} & {col}>{min}'.format(col, min, max)
                for col in df.columns)
df.query(qs)

我个人会这样做,就像@DSM建议的那样。除非你出于某种原因需要查询字符串(可能要将其打印出来?),否则构建一个字符串以将其作为表达式进行评估,而不是构建表达式,这通常是错误的答案。