[英]Trying to filter one list according to whether elements are in another list in Python
我正在尝试根据它们是否在参考列表中过滤我获得的基因列表。 我查看了这些问题,这些问题很有帮助,但它们并没有帮助我解决我遇到的问题( if/else in a list comprehension , List comprehension with else pass , if 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.