python - 从列表中查找基因名称到数据框

标签 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,那么如果我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)

最佳答案

使用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

关于python - 从列表中查找基因名称到数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50256344/

相关文章:

python - 以元组为键的字典中具有最高值的前 n 个键

python - 为什么这个计时器只打印最终结果而不是每秒更新一次?

python - 获取matplotlib中的数字列表

java - 如何只循环一次组合?

c - C 中 while 循环中的++i 和 i++

python - 如何在 Pandas 列字符串中插入空格

python - Pandas :忽略新行作为 read_csv 中的分隔符

python - 如何获取 pandas 数据框,其中列是另一个列数据框的后续 n 元素?

python - 根据频率,用列中的随机值填充 DataFrame 的 NaN 值

python - pyautogui typewrite 不会停止打字