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