0

假设我在 Pandas 中有一个由几列组成的数据框。我想选择数据框的子集,其中所有列都在两个值minmax.

我怎样才能做到这一点query?我是否需要在表达式中一一指定每个列名,例如:

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

除了查询,我还有什么其他选择?也许使用直接满足条件的索引?

4

2 回答 2

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是值得的。

于 2014-08-22T21:44:25.593 回答
3

我不确定你为什么认为你需要query这里。但如果你想这样做,你可以。您已经使用该format语句动态构建查询字符串;您只需要通过加入理解使其更具动态性。例如:

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

我个人会按照@DSM 建议的方式执行此操作。除非您出于某种原因确实需要查询字符串(也许要打印出来?),否则构建一个字符串以将其作为表达式进行评估,而不是构建一个表达式,通常是错误的答案。

于 2014-08-22T21:44:18.373 回答