2 回答
TA贡献1884条经验 获得超4个赞
你很接近,但你不需要query反复调用。只需使用构建您的查询字符串str.join并query在之后进行一次调用。
data = [(1, 2), (1, 5), (2, 3)]
pattern = '(' + ') | ('.join(f"x == {a} & y == {b}" for a, b in data) + ')'
pattern
# '(x == 1 & y == 2) | (x == 1 & y == 5) | (x == 2 & y == 3)'
df.query(pattern)
x y z
0 1 2 3
1 1 5 6
3 2 3 8
另一种选择是使用Index.isin和一些过滤:
df[df.set_index(['x', 'y']).index.isin(data)]
x y z
0 1 2 3
1 1 5 6
3 2 3 8
或者,使用MultiIndex.from_arrays以下方法构建 MultiIndex :
df[pd.MultiIndex.from_arrays([df['x'], df['y']]).isin(data)]
x y z
0 1 2 3
1 1 5 6
3 2 3 8
结果相同,效率更高。
TA贡献1844条经验 获得超8个赞
或者你可以做一个df.set_index()and df.loc[]:
xy_list=[(1,2),(1,5),(2,3)]
df_new=df.set_index(['x','y']).loc[xy_list].reset_index()
x y z
0 1 2 3
1 1 5 6
2 2 3 8
添加回答
举报