2 回答

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
你很接近,但你不需要query反復(fù)調(diào)用。只需使用構(gòu)建您的查詢字符串str.join并query在之后進(jìn)行一次調(diào)用。
data = [(1, 2), (1, 5), (2, 3)]
pattern = '(' + ') | ('.join(f"x == {a} & y == " 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和一些過(guò)濾:
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以下方法構(gòu)建 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
結(jié)果相同,效率更高。

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
或者你可以做一個(gè)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
添加回答
舉報(bào)