如何同时在多列上按条件列表过滤 DataFrame 行

How to filter DataFrame rows by list of conditions simultaneously on multiple columns

我有一个 DataFrame,我想在其中过滤应用同时适用于两列的条件列表的行。例如:

pd.DataFrame({'A':['Y','Y','Y','Z','Z'],'B':[1,2,2,3,4],'C':[100,200,234,358,4243]})
   A  B     C
0  Y  1   100
1  Y  2   200
2  Y  2   234
3  Z  3   358
4  Z  4  4243
filter_on=[('Y',2),('Z',4)]

过滤时 A​​B 具有 filter_on[ 中的任何一对值=19=] ,我应该得到以下 DataFrame:

   A  B     C
1  Y  2   200
2  Y  2   234
4  Z  4  4243
data.iloc[[i for  i,(a,b) in enumerate(zip(data.A, data.B)) if (a,b) in filter_on]]

转换为 tuple

后尝试使用 isin
out = df[df[['A','B']].apply(tuple,1).isin(filter_on)].copy()
   A  B     C
1  Y  2   200
2  Y  2   234
4  Z  4  4243

您可以构建一个 MultiIndex from the columns and use isin 来计算掩码,如下所示:

mask = pd.MultiIndex.from_arrays([df['A'], df['B']]).isin(filter_on)
print(df[mask])

输出

   A  B     C
1  Y  2   200
2  Y  2   234
4  Z  4  4243

这个基于 set_indexIndex.isin 的简洁解决方案怎么样?

df[df.set_index(['A', 'B']).index.isin(filter_on)]

   A  B     C
1  Y  2   200
2  Y  2   234
4  Z  4  4243