有没有办法根据列表过滤 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
我有一个分类列表,这些分类在列表中的级别上并不统一,我想针对列表中的每个项目过滤数据框的所有列以生成单个子数据框.
示例列表是
['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