如何同时在多列上按条件列表过滤 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_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
我有一个 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_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