我必须将一系列字典插入到通过for循环生成的数据框中,我想让字典的键成为数据框列的标签,并将字典中的值插入到每个字典中行。
def description_all(df):
full_descriptor=pd.DataFrame()
for index, row in df.iterrows():
mol = Chem.MolFromSmiles(df.at[index, 'smiles'])
vals = Descriptors.CalcMolDescriptors(mol)
... #i need this part
小代码解释
我目前正在使用 rdkit 库(化学材料库),在使用 Chem.MolFromSmiles(.. .)我获得一个 mol 类,然后使用 Descriptors.CalcMolDescriptors(mol) 我获得一个字典。
所以我需要一种方法将该字典放入每个 for 循环的数据框中。
编辑
from rdkit import Chem
from rdkit.Chem import Descriptors
#example of input
data = [
{"ID": "ZINC000000793995", "SMILES": "COc1cccc(CNc2ccc(S(=O)(=O)Nc3nccs3)cc2)c1O"},
{"ID": "ZINC000000579895", "SMILES": "COc1cc(-c2ccc(O)cc2)c(OC)c(O)c1-c1ccc(OCC=C(C)C)c(O)c1"},
{"ID": "ZINC000000532501", "SMILES": "O=C(O)c1cc2cc(Cl)ccc2o1"}
]
df = pd.DataFrame(data)
我期望的输出是通过将函数 Desripots.CalcMolDescriptors(mol) 作为输出给出的字典转换为数据帧来实现的,该字典由 210 个键组成,每个键都有一个值(基于该函数执行的一些计算)键只有 1 个值(浮点数),所以我想创建一个数据框,如下所示:
最大AbsE状态索引 | 最大房地产指数 | 最小房地产指数 | qed | SPS | 等等 |
---|---|---|---|---|---|
11.038589741337306 | 11.038589741337306 | 0.05306747081548657 | -0.12265326012304678 | 0.4358923373790937 | .... |
10.528754724111867 | 10.528754724111867 | 0.07197530864197499 | -1.0765532879818591 | 0.7631338366688623 | .... |
这样标签就是字典的键(所有函数 Desripots.CalcMolDescriptors(mol) 相同的字典)并且每一行都对应于顶部标签中每个键的值
我会尽力回答你的问题;但是,请将来提供更多信息,正如 @mozway 评论的那样。
由于信息有限,我做了一些假设:
df
包含 'smiles'
列full_descriptor
应包含 Descriptors.CalcMolDescriptors()
的最终输出,根据代码临时存储在 vals
我从官方文档描述符计算中改编了一个解决方案。
import pandas as pd
from rdkit import Chem
from rdkit.Chem import Descriptors
# create dummy df with a smiles column
df = pd.DataFrame({'smiles': ['CCO', 'CCN', 'CCOCC']})
# get mol objects from smiles
df['mol'] = df['smiles'].apply(Chem.MolFromSmiles)
# calculate descriptors, convert to list for dataframe creation
list_of_descriptors = df['mol'].apply(Descriptors.CalcMolDescriptors).to_list()
full_descriptor = pd.DataFrame(list_of_descriptors)
说明:
Chem.MolFromSmiles()
应用于 'smiles'
列中的每个元素,并将对象存储在新创建的 'Mol'
列中。Descriptors.CalcMolDescriptors()
应用于每个 Mol
对象并将生成的字典存储为字典列表。full_descriptors
DataFrame。键将用作列。如果您想将函数应用于 DataFrame/Series 的每一行/列,则
.apply()
函数通常比使用 for 循环更有效。
或者,您也可以将 mol 对象存储在临时变量中,而不是原始 DataFrame 中的新列:
mols = df['smiles'].apply(Chem.MolFromSmiles)
list_of_descriptors = mols.apply(Descriptors.CalcMolDescriptors).to_list()
如果它解决了您的问题,请不要忘记接受这个答案;)
您还没有给我们一个
Descriptors.CalcMolDescriptors(mol)
的例子
输出。我假设它是一本字典,其值如下:
{'val_a':1, 'val_b':2} or {'val_c':5, 'val_d':4, 'val_a':3}
因此,您可以将每次迭代的结果添加到列表中以生成字典列表,然后将其转换为数据框:
import pandas as pd
def description_all(df):
results = []
for index, row in df.iterrows():
mol = Chem.MolFromSmiles(df.at[index, 'smiles'])
vals = Descriptors.CalcMolDescriptors(mol)
results.append(vals)
return pd.DataFrame(results)
输出:
val_a val_b val_c val_d
0 1 2.0 NaN NaN
1 3 NaN 5.0 4.0