尝试根据元素是否在 Python 中的另一个列表中来过滤一个列表

Trying to filter one list according to whether elements are in another list in Python

我正在尝试根据它们是否在参考列表中来过滤我获得的基因列表。我看过这些问题,它们很有帮助,但它们并没有帮助我解决我遇到的问题 (if/else in a list comprehension, , if pass and if continue in python, Remove all the elements that occur in one list from another)。特别是最后一个问题的一些答案似乎很有帮助,但它们似乎不适用于我的数据。

我试图简化我正在做的事情,这是我现在的一个小玩具示例:

head = genes_9.head()
diff_expressed_tf = [gene for gene in genes_9 if gene in head]
diff_expressed_tf

# This returns 
[]

我在想,如果我能让它与“genes_9.head()”一起工作,它应该与我的实际参考数据一起工作。

有人能帮我重写这个来做我想让它做的事吗?或者,如果有人可以指出其他相关问题,我也将不胜感激。

作为参考,这里是我的一小段数据:

genes_9.head(10)


0      Tnfrsf4
2     Tnfrsf18
14       Il2ra
5         Odc1
7        Foxp3
36       Ctla4
3        Ikzf2
1          Cd5
8         Ccr8
24     Tnfrsf9

Python 列表没有“head”方法。相反,尝试 genes_9[0:10] 列表中的前 10 个元素。

如果您使用的是 Pandas DataFrame,则可以使用 iterrows() 方法遍历行。例如:

diff_expressed_tf = [gene[gene_column] for index, gene in genes_9.iterrows() if gene in head] 其中 gene_column 是您的基因在哪一列中命名。

否则,您的代码看起来没问题。

如果您的数据类型是 Pandas 系列,那么您可以使用 'iteritems()' 而不是 'iterrows()',如下所示:

diff_expressed_tf = [gene for index, gene in genes_9.iteritems() if gene in head]

由于您使用的是 Pandas DataFrame,因此在没有 for 循环的情况下执行操作要快得多。

您可以 select 使用 pandas.DataFrame.isin

头部的数据框行
result = genes_9[genes_9['Tnfrsf4'].isin(head['Tnfrsf4'])]

例子

data = '''0      Tnfrsf4
2     Tnfrsf18
14       Il2ra
5         Odc1
7        Foxp3
36       Ctla4
3        Ikzf2
1          Cd5
8         Ccr8
24     Tnfrsf9'''

genes_9 = pd.read_csv(StringIO(data), sep = "\s+")
head = genes_9.head(5)               # Use first 5 rows as head
result = genes_9[genes_9['Tnfrsf4'].isin(head['Tnfrsf4'])]
print(result)  # Output is the rows of head
    0   Tnfrsf4
0   2   Tnfrsf18
1   14  Il2ra
2   5   Odc1
3   7   Foxp3
4   36  Ctla4