代码之家  ›  专栏  ›  技术社区  ›  d_kennetz

将元组列表中的对象与dataframe中的对象匹配,如果存在匹配项,则创建新列

  •  0
  • d_kennetz  · 技术社区  · 6 年前

    考虑以下元组列表:

    some_strings = [('Name1', 'ABCD', 'DEFG', 'Score=12'),
                    ('Name2', 'JKLL', 'RMPQ', 'Score=11')]
    

    以及以下数据帧:

    Sequence ID    Left Sequence    Right Sequence
    Name1              ABCD             RQLM
    Name1              ABCR             PLMT
    Name2              JKLL             ZFGQ
    Name2              RPLP             FTRD
    

    我试图将tuple中的第二个对象与df列['Left Sequence']进行比较,以检查是否完全匹配(与部分匹配无关),如果匹配发生,请在df末尾的新列中打印dimer。如果不匹配,我将打印NA。以下是我尝试过的代码:

    for x in some_strings:
        for y in x:
            df['Dimers'] = df['Left Sequence'].apply(lambda s: 'Dimer' if s == y[1] else 'NA')
    

    我的预期产出:

    Sequence ID    Left Sequence    Right Sequence    Dimers
    Name1              ABCD             RQLM          Dimer
    Name1              ABCR             PLMT           NA
    Name2              JKLL             ZFGQ          Dimer
    Name2              RPLP             FTRD           NA
    

    我的实际输出(你可能猜得到):

    Sequence ID    Left Sequence    Right Sequence    Dimers
    Name1              ABCD             RQLM           NA
    Name1              ABCR             PLMT           NA
    Name2              JKLL             ZFGQ           NA
    Name2              RPLP             FTRD           NA
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   BENY    6 年前

    创建布尔掩码:我们使用 isin 创建遮罩

    mask=df.iloc[:,:-1].apply(tuple,1).isin([x[:-2] for x in some_strings])    
    df['Dimer']='NA'
    df.loc[mask,'Dimer']='Dimer'        
    df
    Out[1120]: 
      SequenceID LeftSequence RightSequence  Dimer
    0      Name1         ABCD          RQLM  Dimer
    1      Name1         ABCR          PLMT     NA
    2      Name2         JKLL          ZFGQ  Dimer
    3      Name2         RPLP          FTRD     NA