如何在多列上同时按条件列表筛选DataFrame行



我有一个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)]

当过滤ABfilter_on处有任何一对值时,我应该得到以下DataFrame:

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

转换为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,并使用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
data.iloc[[i for  i,(a,b) in enumerate(zip(data.A, data.B)) if (a,b) in filter_on]]

这个简洁的基于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

最新更新