假设我在Pandas中有一个由几个列组成的数据框架。我想选择数据帧的子集,其中所有列位于两个值min
和max
之间。
我如何使用query
做到这一点?我是否需要在表达式中逐一指定每个列名?例如:
df.query('(A<{max} & A>{min}) & (B{min} & B{max}) & (C{min} & C{max})'.format(min,max))
除了查询,我还有什么其他的选择?也许是直接满足条件的索引?
对于您的用例,我将以非查询方式进行,构建一个布尔框架,然后调用.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
的优势是值得的。
我不知道为什么你认为你需要query
在这里。但如果你想这样做,你可以。你已经用format
语句动态地建立了查询字符串;您只需要通过加入一个推导式,使它更加动态。例如:
qs = ' & '.join('{col}<{max} & {col}>{min}'.format(col, min, max)
for col in df.columns)
df.query(qs)
我个人会按照@DSM建议的方式来做。除非您出于某种原因(可能是为了打印它?)而实际需要查询字符串,否则构建字符串以将其作为表达式求值,而不是构建表达式,通常是错误的答案。