我有一个化学信息数据集(输入数据),其行ID为索引,编码器功能将我的微笑字符串转换为numpy ndarray形式的二进制数。我想在输入数据框中添加另一列作为指纹,但是当我转换为熊猫系列时遇到错误。谁能告诉我该怎么做?
for index, row in input_table.iterrows():
fp_a=(mhfp_encoder.secfp_from_smiles(row['usmiles_c'])) #creates a binary num
column_series = pd.Series(fp_a)
input_table['new_col']=pd.Series(fp_a)
错误:值的长度与索引的长度不匹配
答案 0 :(得分:0)
出现错误是因为pd.Series给您的数据帧有2048行(MHFP指纹的位长),但是您的数据帧有另外的行数。
您可以采用另一种方式将指纹添加到数据框中。
如果您有这样的数据框
import pandas as pd
smiles = ['CCC(C)(C)N', 'NCC(O)CO', 'NCCN1CCNCC1','NCCN']
input_table = pd.DataFrame(smiles, columns=['usmiles_c'])
print(input_table)
usmiles_c
0 CCC(C)(C)N
1 NCC(O)CO
2 NCCN1CCNCC1
3 NCCN
做了这样的指纹
from mhfp.encoder import MHFPEncoder
mhfp_encoder = MHFPEncoder()
fps = []
for smiles in input_table['usmiles_c']:
fp = mhfp_encoder.secfp_from_smiles(smiles)
fps.append(fp)
您可以将整个指尖添加到一列中
input_table['new_col'] = fps
print(input_table)
usmiles_c new_col
0 CCC(C)(C)N [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..., 0
1 NCC(O)CO [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..., 0
2 NCCN1CCNCC1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..., 0
3 NCCN [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..., 0
或为每个位分别创建一列
col_name = range(len(fps[0]))
for n in col_name:
input_table[n] = [m[n] for m in fps]
print(input_table)
usmiles_c 0 1 2 3 4 5 ... 2041 2042 2043 2044 2045 2046 2047
0 CCC(C)(C)N 0 0 0 0 0 0 ... 0 0 0 0 0 0 0
1 NCC(O)CO 0 0 0 0 0 0 ... 0 0 0 0 0 0 0
2 NCCN1CCNCC1 0 0 0 0 0 0 ... 0 0 0 0 0 0 0
3 NCCN 0 0 0 0 0 0 ... 0 0 0 0 0 0 0