【发布时间】:2018-10-19 17:56:02
【问题描述】:
如果我的结果,我实际上必须知道我是否得到了一些基因,这样做我有一个包含我基因名称的列表和一个相同的数据框:
例如
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,那么如果我in 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,因为我的数据 EOG090X00LI 和 EOG090X00GO 中只有 2 个序列
其实这里我想统计一个序列只出现一次的时候才出现,即使是举例: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)
【问题讨论】: