从数据集中查找基因名称

时间:2018-05-09 14:52:41

标签: python pandas loops

我实际上必须知道,如果我的结果是否有一些基因,为此我有一个列表,其中包含我的基因名称和具有相同相同数据的数据框:

例如

liste["gene1","gene2","gene3","gene4","gene5"]

和数据框:

name1          name2
gene1_0035     gene1_0042
gene56_0042    gene56_0035
gene4_0042     gene4_0035
gene2_0035     gene2_0042
gene57_0042    gene57_0035
然后我做了:

df=pd.read_csv("dataframe_not_max.txt",sep='\t')
df=df.drop(columns=(['Unnamed: 0', 'Unnamed: 0.1']))
#print(df)
print(list(df.columns.values))
name1=df.ix[:,1]
name2=df.ix[:,2]


liste=[]
for record in SeqIO.parse(data, "fasta"):
    liste.append(record.id)

print(liste)
print(len(liste))

count=0
for a, b in zip(name1, name2):

    if a in liste:
        count+=1

    if b in liste: 
        count+=1
print(count)

我想要的是知道从我的列表中找到ma数据帧中的基因多少次,但它们没有完全相同的ID,因为在列表中没有基因名称后的_number,那么if i在liste中没有重新标识ID。

是否可以这样说:

if a without_number in liste: 

在上面的例子中,它将是: count = 3,因为列表和数据文件中只有基因1,2和4。

这是一个更复杂的例子,看看你的脚本是否确实适用于我的数据: 假设我有一个数据框:

  cluster_name  qseqid  sseqid  pident_x
15  cluster_016607  EOG090X00GO_0035_0035   EOG090X00GO_0042_0035
16  cluster_016607  EOG090X00GO_0035_0035   EOG090X00GO_0042_0042
18  cluster_016607  EOG090X00GO_0035_0042   EOG090X00GO_0042_0035
19  cluster_016607  EOG090X00GO_0035_0042   EOG090X00GO_0042_0042
29  cluster_015707  EOG090X00LI_0035_0035   EOG090X00LI_0042_0042
30  cluster_015707  EOG090X00LI_0035_0035   EOG090X00LI_0042_0035
34  cluster_015707  EOG090X00LI_0042_0035   g1726.t1_0035_0042
37  cluster_015707  EOG090X00LI_0042_0042   g1726.t1_0035_0042

和一个清单:["EOG090X00LI_","EOG090X00GO_","EOG090X00BA_"]

这里我得到6但我应该得到2因为我的数据中只有2个序列EOG090X00LI和EOG090X00GO

事实上,在这里我想计算一个序列出现时只出现一次,即使它是例如:EOG090X00LI vs seq123454

我不知道是否清楚?

我用过例子:

df=pd.read_csv("test_busco_augus.csv",sep=',')
#df=df.drop(columns=(['Unnamed: 0', 'Unnamed: 0.1']))
print(df)
print(list(df.columns.values))
name1=df.ix[:,3]
name2=df.ix[:,4]

liste=["EOG090X00LI_","EOG090X00GO_","EOG090X00BA_"]

print(liste)


#get boolean mask for each column    
m1 = name1.str.contains('|'.join(liste))
m2 = name2.str.contains('|'.join(liste))

#chain masks and count Trues

a = (m1 & m2).sum()
print (a)

4 个答案:

答案 0 :(得分:4)

我认为需要:

liste=["EOG090X00LI","EOG090X00GO","EOG090X00BA"]

#extract each values before _, remove duplicates and compare by liste   
a = name1.str.split('_').str[0].drop_duplicates().isin(liste)
b = name2.str.split('_').str[0].drop_duplicates().isin(liste)

#compare a with a for equal and sum Trues
c = a.eq(b).sum()
print (c)
2

编辑:

Task

答案 1 :(得分:4)

调整更新的OP

找到sum等于1的位置

df.stack().str.split('_').str[0].isin(liste).sum(level=0).eq(1).sum()

2

旧答案

stackstr访问者

您可以使用split上的'_'抓取第一部分,然后使用isin确定成员资格。我还使用stackall参数level=0来查看所有列的成员资格是否为True

df.stack().str.split('_').str[0].isin(liste).all(level=0).sum()

3

applymap

df.applymap(lambda x: x.split('_')[0] in liste).all(1).sum()

3
带有生成器的

sum / all

sum(all(x.split('_')[0] in liste for x in r) for r in df.values)

3

两个map

sum(map(lambda r: all(map(lambda x: x.split('_')[0] in liste, r)), df.values))

3

答案 2 :(得分:4)

使用isin

df.apply(lambda x : x.str.split('_').str[0],1).isin(l).sum(1).eq(2).sum()
Out[923]: 3

添加value_counts

df.apply(lambda x : x.str.split('_').str[0],1).isin(l).sum(1).value_counts()
Out[925]: 
2    3
0    2
dtype: int64

答案 3 :(得分:3)

您可以使用stack()将数据框转换为系列(合并所有列),然后使用liste_中搜索您的基因名称,然后搜索下划线Series.str.match()

s = df.stack()

sum([s.str.match(i+'_').any() for i in liste])

返回3

<强>详细信息:

df.stack()返回以下Series

0  name1     gene1_0035
   name2     gene1_0042
1  name1    gene56_0042
   name2    gene56_0035
2  name1     gene4_0042
   name2     gene4_0035
3  name1     gene2_0035
   name2     gene2_0042
4  name1    gene57_0042
   name2    gene57_0035

由于该系列中的所有基因后跟一个下划线,您只需要查看gene_name后跟_是否在该系列中。如果是这种情况,s.str.match(i+'_').any()会返回True。然后,您得到True值的总和,这是您的计数。