将元组列表中的对象与数据帧中的对象进行匹配,如果存在匹配项,则创建新列

时间:2018-09-21 19:55:37

标签: python string pandas tuples

考虑以下元组列表:

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

我试图将元组中的第二个对象与df ['Left Sequence']列进行比较以检查是否完全匹配(不考虑部分匹配),如果匹配发生,则在新列中打印二聚体在df末尾。如果没有发生匹配,我将打印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 个答案:

答案 0 :(得分:1)

创建布尔型的掩码:我们使用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