如何在 DataFrame 中插入 x 字典?

问题描述 投票:0回答:2

我必须将一系列字典插入到通过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) 相同的字典)并且每一行都对应于顶部标签中每个键的值

python pandas dictionary rdkit
2个回答
0
投票

我会尽力回答你的问题;但是,请将来提供更多信息,正如 @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()

如果它解决了您的问题,请不要忘记接受这个答案;)


0
投票

您还没有给我们一个

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
© www.soinside.com 2019 - 2024. All rights reserved.