有没有办法根据列表过滤 pandas 数据框的所有列?

Is there a way to filter all columns of a pandas dataframe against a list?

我有一个分类列表,这些分类在列表中的级别上并不统一,我想针对列表中的每个项目过滤数据框的所有列以生成单个子数据框.

示例列表是

['Sk1','Sub1','Family 3','Clade C']

我的实际列表有 23 个项目。

一个看起来像这样的示例数据框,我的实际数据框有 1100 行:

Species Super kingdom Subkingdom Clade Class Family
Species 1 SK1 Sub1 Clade A Class I Family 1
Species 2 SK2 Sub2 Clade B Class II Family 2
Species 3 SK3 Sub3 Clade C Class III Family 3
Species 4 Sk4 Sub4 Clade D Class IV Family 4

因此根据列表过滤框架应该给出:

Species Super kingdom Subkingdom Clade Class Family
Species 1 SK1 Sub1 Clade A Class I Family 1
Species 3 SK3 Sub3 Clade C Class III Family 3

我最接近的一些解决方案是使用 np 和 pandas 作为:

mask = np.column_stack([taxonframe[col].str.contains(Query, na=False) for col in taxonframe])
taxonframe.loc[mask.any(axis=1)]

但是这个需要我遍历查询列表并为列表中的每个项目创建一个数据框,并以某种方式合并 23 个数据框(我试图避免这个)。

我可以在每一行上使用 itertuples() 并将每一行作为列表进行字符串搜索,然后将它们转换回新的数据框 - 如果没有别的,我想我可以使用它。有没有优雅的 pandas 方法来做到这一点?

假设其他列不能包含来自其他列的相同字符串(例如Clade列不能包含Family 3等),您可以使用isin + any创建一个布尔掩码来过滤 df:

out = df[df.isin(['Sk1','Sub1','Family 3','Clade C']).any(axis=1)]

输出:

     Species Super kingdom Subkingdom    Clade      Class    Family
0  Species 1           SK1       Sub1  Clade A    Class I  Family 1
2  Species 3           SK3       Sub3  Clade C  Class III  Family 3