RDKit入門④：複数分子の読み込み (後編)とデータフレームの加工

この記事は以下の記事の続きとなります。
[RDKit入門③：複数分子の読み込み (前編)と分子群の描画][1]
[1]:https://qiita.com/Ru-PNP/items/1cea34b864e993e4e1e1
今回はPandasToolsを用いてsdfファイルを読み込んでデータフレームを作成し、
それを加工したりExcelファイルとして出力したりします。
また、SMILES構造式の書かれたExcelファイルからの分子群生成も行います。
###環境
- windows 10
- python 3.8.5
- RDKit 2020.09.4

---
まずは今回の題材となるsdfファイルを入手します。
今回はPlatinum Datasetと呼ばれるデータセットのsdfを使用します。

入手手順：
[ウィーン大学のComputational Drug Discovery and Design Group][2]にアクセスします。
Platinum Dataset 2017_01をクリックしてzipファイルをダウンロードし、解凍して
中身のplatinum_dataset_2017_01.sdfを作業ディレクトリに移しておいてください。
[2]:https://comp3d.univie.ac.at/servers-datasets/

Platinum Datasetは主に配座予測の精度検証に用いられるデータセットですが、
含まれる分子群が構造多様性に富み、また分子数が5,000弱と重すぎず練習用にも使えそうなので、
これを加工し次回移行も題材として使用したいと思います。

---
##sdfファイルの読み込み方法について
前回と重複しますが、sdfファイルの読み込み方法として以下の2つがあります。
> Chem.SDMolSupplier(<i>path-to-sdf</i>)
> PandasTools.LoadSDF(<i>path-to-sdf</i>)

[前回の記事][1]では前者の使い方を紹介いたしました。
前者を用いた場合、sdfファイル記載の分子プロパティはmolオブジェクトに内蔵されていましたが
GetPropメソッドを使わないとプロパティを取得できず、視認性が悪く不便でした。

今回紹介するPandasTools.LoadSDFでは分子情報がデータフレーム型として読み込まれ、
molオブジェクトが格納された列とは別の列にプロパティが格納されます。

まずは今回使うパッケージを読み込んでおきましょう。

```python
from rdkit import Chem
from rdkit.Chem import Draw, PandasTools
import pandas as pd
#パッケージの読み込み
```

---
###PandasTools.LoadSDFについて
まずはplatinum_dataset_2017_01.sdfを読み込んでみます。

```python
df = PandasTools.LoadSDF("platinum_dataset_2017_01.sdf")
#sdfファイルを読み込んでデータフレームを作成し、dfと定義した。
```
このメソッドではプロパティとmolオブジェクトがそれぞれ別の列に格納されます。
デフォルト設定ではmolオブジェクトはROMolという名前の列に格納されます。
以下、デフォルトで指定されている値の一部を紹介します。

- molColName = 'ROMol'　(molオブジェクトはROMolという名前の列に格納)
- smilesName = None　(molオブジェクトからSMILES構造式を生成しない)
- embedProps = False　(molオブジェクト自体にはプロパティを付与しない)
- removeHs = True　(水素原子は除去する)

smilesName = '(任意の列名)'のように指定した場合、molオブジェクトから生成したSMILESを
(任意の列名)という名前の列に格納することもできます。

```python
df_smiles = PandasTools.LoadSDF("platinum_dataset_2017_01.sdf", smilesName = 'SMILES')
#sdfファイルを読み込んでデータフレームを作成しつつ、SMILES構造式も生成して格納した。
#データフレームはdf_smilesと定義し、SMILES構造式が格納される列の名前はSMILESと定義した。
```

---
生成したデータフレームはpandasを用いて取り扱うことができます。
試しにdf_smilesからROMolの列を削除し、Excelファイルとして保存してみましょう。

```python
df_smiles = df_smiles.drop(columns = 'ROMol')
#df_smilesからROMolの列を削除したデータフレームを作成し、df_smilesと定義した(上書き)。

df_smiles.to_excel("platinum_dataset_2017.xlsx", index = False)
#df_smilesをplatinum_dataset_2017.xlsxという名前のExcelファイルとして保存した。
```

今回生成したExcelファイルは元のsdfファイルから化合物の原子座標の情報を削除しているため、
配座予測の精度検証の用途としては使えなくなりますが、その分データ容量が軽くて便利です。

---
###PandasTools.AddMoleculeColumnToFrameについて
PandasToolsを用いると、SMILES構造式を含むデータフレームからmolオブジェクトを作成できます。
先程作成したExcelファイルを読み込み、molオブジェクトを生成してみましょう。

```python
df_Pt = pd.read_excel("platinum_dataset_2017.xlsx")
#platinum_dataset_2017.xlsxを読み込んでデータフレームを作成し、df_Ptと定義した。

PandasTools.AddMoleculeColumnToFrame(df_Pt, smilesCol = 'SMILES')
#df_PtのSMILES列を読み込み、molオブジェクトを生成した。
```

今度もdf_Ptは学習の題材として使用する予定です。
毎回Excelファイルの読み込み→molオブジェクトの作成を行うのは手間になるので、
今回作成したデータフレームはpickleファイルとして保存しておきましょう。

```python
df_Pt.to_pickle("platinum_dataset_2017.pkl")
#df_Ptをplatinum_dataset_2017.pklという名前のpickleファイルとして保存した。
```

---
##おわりに
今回はRDKitを用いて以下の内容を実施いたしました。
- PandasToolsを用いたsdfファイルの読み込みによるデータフレーム作成
- pandasを用いたデータフレームの保存・読み込み
- PandasToolsを用いたSMILES構造式からのmolオブジェクト生成

###参考
今回の記事を書くにあたっては[化学の新しいカタチ](https://future-chem.com/)さんの以下の記事を参考にいたしました。
- [RDKitのPandasToolsでデータ分析を加速する](https://future-chem.com/rdkit-pandastools/)