Python: добавление значений numpy ndarray в существующие панды Dataframe - PullRequest
0 голосов
/ 09 июля 2019

У меня есть набор данных хеминформатики (входные данные) с идентификатором строки в качестве индекса, а функция кодировщика преобразует мою строку улыбки в двоичное число в виде пустого 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)

ошибка: длина значений не соответствует длине индекса

1 Ответ

0 голосов
/ 14 июля 2019

Вы получаете ошибку, потому что 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
...