我有一个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处有任何一对值时,我应该得到以下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_index
和Index.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