Python:将numpy ndarray的值添加到现有的熊猫数据框

时间:2019-07-09 16:26:02

标签: python-3.x dataframe numpy-ndarray encoder

我有一个化学信息数据集(输入数据),其行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)

错误:值的长度与索引的长度不匹配

1 个答案:

答案 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