如果您尝试构建动态查询,则有更简单的方法。这是一个使用列表推导和的示例
str.join:
query = ' & '.join(['{}>{}'.format(k, v) for k, v in limits_dic.items()])或者,将
f-strings与python-3.6 +一起使用,
query = ' & '.join([f'{k}>{v}' for k, v in limits_dic.items()])print(query)'A>0 & C>-1 & B>2'将查询字符串传递给
df.query,这就是为了这个目的:
out = df.query(query)print(out) A B C1 2 5 22 10 3 14 3 6 2
如果我的列名包含空格或其他奇怪的字符怎么办?
从pandas 0.25起,您可以将列名包装在反引号中,这样可以正常工作:
query = ' & '.join([f'`{k}`>{v}' for k, v in limits_dic.items()])有关更多信息,请参见此堆栈溢出文章。
df.eval如果要为查询获取布尔掩码,也可以使用它,然后在此之后索引将变得很简单:
mask = df.eval(query)print(mask)0 False1 True2 True3 False4 Truedtype: boolout = df[mask]print(out) A B C1 2 5 22 10 3 14 3 6 2
字符串数据
如果您需要查询使用字符串数据的列,则上面的代码将需要进行一些修改。
考虑:
df = pd.Dataframe({'gender':list('MMMFFF'), 'height':[4,5,4,5,5,4], 'age':[70,80,90,40,2,3]})print (df) gender height age0 M 4 701 M 5 802 M 4 903 F 5 404 F 5 25 F 4 3以及列,运算符和值的列表:
column = ['height', 'age', 'gender']equal = ['>', '>', '==']condition = [1.68, 20, 'F']
这里的适当修改是:
query = ' & '.join(f'{i} {j} {repr(k)}' for i, j, k in zip(column, equal, condition))df.query(query) age gender height3 40 F 5有关
pd.eval()功能系列,其功能和使用案例的信息。



