この記事は以下の記事の続きとなります。
[RDKit入門④:複数分子の読み込み (後編)とデータフレームの加工][1]
[1]:https://qiita.com/Ru-PNP/items/62a108d92c1ddd522e58
今回はデータフレーム内の分子群に対して部分構造検索を実施します。
いくつか方法があるので順に紹介していきます。
###環境
- windows 10
- python 3.8.5
- RDKit 2020.09.4
先にパッケージの読み込みを行います。
from rdkit import Chem
from rdkit.Chem import Draw
import pandas as pd
#パッケージの読み込み
前回の記事の最後でデータフレームをpickleファイルとして保存しておきました。
まずはそれを読み込んで作業を再開しましょう。
df_Pt = pd.read_pickle("platinum_dataset_2017.pkl")
#platinum_dataset_2017.pklを読み込み、得られたデータフレームをdf_Ptと定義した。
###HasSubstructMatchを使う方法について
まずは1分子に対して部分構造検索をかけたときと同じようにHasSubstructMatchを使います。
lambda式と組み合わせて使用します。
以下で臭化アリール・ヨウ化アリールを拾う方法を紹介します。
query_1 = Chem.MolFromSmarts("c[Br,I]")
#検索したい構造をSMARTS記法で表し、query_1というmolオブジェクトとして定義した。
df_1 = df_Pt[df_Pt['ROMol'].map(lambda x: x.HasSubstructMatch(query_1)) == True]
#query_1の部分構造を有する化合物のデータフレームを作成し、df_1とした。
なお、== Trueの部分は省略しても同じdf_1が得られます。
また、末尾を== Falseに書き換えることで、指定した部分構造を持たない化合物群を得ることも。
念の為、df_1に格納された分子のうち最初の20個を表示してみましょう。
Draw.MolsToGridImage(df_1['ROMol'], molsPerRow = 5, maxMols = 20)
#df_1のROMolの列に格納された分子のうち最初の20個を表示した。
###ge比較演算子を使う方法について
「>=(ge比較演算子)」を用いると、HasSubstructMatch関数を使うより短く書くことができます。
試しにスピロ化合物をピックアップしてみます。
query_2 = Chem.MolFromSmarts("[*x4R2]")
#スピロ原子をSMARTS記法で表し、query_2と定義した。
df_2 = df_Pt[df_Pt['ROMol'] >= query_2]
#query_2の部分構造を有する化合物をピックアップしたデータフレームをつくり、df_2と定義した。
この方法を用いるとHasSubstructMatch関数を利用するより短いコードで検索が可能です。
「>=(ge比較演算子)」の他には
- 「==(eq比較演算子)」
- 「!=(ne比較演算子)」
- 「<=(le比較演算子)」
が使用可能ですが、「>=(ge比較演算子)」以外は使用する機会がないと思われます。
念の為、df_2に格納された分子のうち最初の20個を描画してみましょう。
Draw.MolsToGridImage(df_2['ROMol'], molsPerRow = 5, maxMols = 20)
#df_2のROMolの列に格納された分子のうち最初の20個を描画した。
###GetSubstructMatchesを使う方法について
以前紹介したGetSubstructMatches関数とlen関数を組み合わせることで、
指定した部分構造を指定した数だけ有する化合物群を拾ってくることも可能です。
query_3 = Chem.MolFromSmarts("n1ccccc1")
#ピリジン骨格をSMARTS記法で表し、query_3と定義した。
df_3 = df_Pt[df_Pt['ROMol'].map(lambda x: len(x.GetSubstructMatches(query_3)) == 3)]
#query_3の部分構造を3つ有する化合物をピックアップしたデータフレームをつくり、df_3と定義した。
この場合は「==(eq比較演算子)」以外にも色々な比較演算子を使用することができます。
念の為、df_3に格納された分子を全て描画してみましょう。
Draw.MolsToGridImage(df_3['ROMol'], molsPerRow = 5)
#df_3のROMolの列に格納された分子を全て描画した。
##おわりに
今回はRDKitを用いて以下の内容を実施いたしました。
- HasSubstructMatch関数を用いた部分構造検索
- ge比較演算子を用いた部分構造検索
- GetSubstructMatches関数とlen関数の組み合わせによる部分構造検索
###参考
今回の記事を書くにあたっては化学の新しいカタチさんの以下の記事を参考にいたしました。