利用python查看并筛选AutoDock Vina的结果中结合能小于-0.7的化合物

书接上回,我们使用批处理程序完成了批量对接(点此回顾)。但是其结果都在一个个单独的文件夹里,批处理只能查看总得数据,无法进一步处理数据。但可以搞成excel可读的一个文件(点我看)。

这次呢,我们用python的pandas库,对结果进行展示,并与之前整理好的数据匹配,得到这些化合物的中英文名字。

一、log.txt文件的批量读取

载入所需要的库

import os
import pandas as pd
import numpy as np

定义一个函数,用来获取txt中排名第一的affinity值

def getmaxaffinity(fpath):
    m = []
    try:
        with open (fpath, encoding = "utf-8") as f:
            for i in f.readlines()[25]:
                if i!= ' ' and i != '\n':
                    m.append(i)
        return ''.join(m[1:5])  
    except:
        return ''    

找到你存对接结果文件夹的根目录,这个是我的目录

f = 'C:\\Users\\O_O\\Desktop\\jupyter\\dock'

使用os.walk批量读取log.txt文件。并将CID和affinity进行配对,放在一个字典里。以用来以后创建表格。

data = {
    
    }
for root,dirs,filename in os.walk(f):
    for dir_name in dirs:
        fpath = f + "\\" + dir_name + "\\log.txt"
        affinity = getmaxaffinity(fpath)
        data[dir_name] = affinity

二、创建表格

dataframe = pd.DataFrame(pd.Series(data),columns = ['affinity'])

这个表格依然存在一些问题,我们对数据进行一下处理。
首先是将cid列命名为CID并作为索引。

df = dataframe.reset_index().rename(columns = {
    
    'index':'CID'})

其次是去除affinity列中的空字符串及空值

df = df.replace('', np.nan)
df = df.dropna(axis =0)

将affinity列变为数字以方便排序

df['affinity'] = df['affinity'].astype(float)
df = df.sort_values('affinity',ascending = True)

三、筛选<-0.7的结果

df7 = df.loc[df['affinity'] < -7.0]

这样就完成了数据的读取和筛选

四、与已有数据库进行比对,得到中英文名称

这个数据库是我之前整理的CID和中英文名的一个excel表格。
读取他,并去除空值,将cid变为str类型以用于匹配

trq = pd.read_excel(r"D:\Doctor\TNF\trq_chengfen.xlsx",header = None)
trq = trq.dropna()
trq[2] = trq[2].astype(int)
trq[2] = trq[2].astype(str)

由于读取的CID列中的文字为Conformer3D_CID_689043,需要去掉Conformer3D_CID_`只保留后面的CID序号。我们在此进行分列处理。

df7['CID'] = df7['CID'].str.split('_',expand = True)[2]

将两个表格合并即可完成匹配。

dff = pd.merge(df7,trq, left_on = 'CID', right_on = 2)

最后保存为excel文件留存。

dff.to_excel("dock_result.xlsx")

猜你喜欢

转载自blog.csdn.net/weixin_55842556/article/details/121439983