繁体   English   中英

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

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

我正在尝试根据它们是否在参考列表中过滤我获得的基因列表。 我查看了这些问题,这些问题很有帮助,但它们并没有帮助我解决我遇到的问题( if/else in a list comprehensionList comprehension with else passif pass and if continue in python删除出现在另一个列表中的所有元素)。 特别是最后一个问题的一些答案似乎非常有帮助,但它们似乎不适用于我的数据。

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

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 列表没有“头”方法。 相反,对列表中的前 10 个元素尝试genes_9[0: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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM