Python 检查列是否包含来自另一列的值

Python 检查列是否包含来自另一列的值,python,pandas,Python,Pandas,如果df['col']='a'、'b'、'c'和df2['col']='a123'、'b456'、'd789'我如何创建df2['is_contained']='a'、'b'、'no_match'其中如果df['col']中的值在df2['col']中找到,则返回df['col'值,如果没有找到匹配项,是否返回“没有匹配项”?另外,我不希望有多个匹配项,但在不太可能的情况下,我希望返回类似“多个匹配项”的字符串。使用此玩具数据集,我们希望在df2中添加一个新列,该列将包含前三行的无匹配项,最后一

如果
df['col']='a'、'b'、'c'
df2['col']='a123'、'b456'、'd789'
我如何创建
df2['is_contained']='a'、'b'、'no_match'
其中如果
df['col']
中的值在
df2['col']
中找到,则返回
df['col'
值,如果没有找到匹配项,是否返回“没有匹配项”?另外,我不希望有多个匹配项,但在不太可能的情况下,我希望返回类似“多个匹配项”的字符串。

使用此玩具数据集,我们希望在
df2
中添加一个新列,该列将包含前三行的
无匹配项,最后一行将包含值
'd'
,因为该行的
col
值(字母
'a'
)出现在df1中

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


df1 = pd.DataFrame({'col': ['a', 'b', 'c', 'd']})
df2 = pd.DataFrame({'col': ['a123','b456','d789', 'a']})
换句话说,只有当一行的
df2['col']
值出现在
df1['col']
中的某个位置时,才应使用
df1
中的值来填充
df2
中的这个新列

In [2]: df1
Out[2]:
  col
0   a
1   b
2   c
3   d

In [3]: df2
Out[3]:
    col
0  a123
1  b456
2  d789
3     a
如果这是理解您的问题的正确方法,那么您可以使用pandas
isin

In [4]: df2.col.isin(df1.col)
Out[4]:
0    False
1    False
2    False
3     True
Name: col, dtype: bool
只有当
df2.col
中的值也在
df1.col
中时,该值才会计算为
True

然后您可以使用
np.where
,如果您对R非常熟悉,它与R中的
ifelse
大致相同

In [5]:     np.where(df2.col.isin(df1.col), df1.col, 'NO_MATCH')
Out[5]:
0    NO_MATCH
1    NO_MATCH
2    NO_MATCH
3           d
Name: col, dtype: object
对于
df1.col
中出现
df2.col
值的行,将为给定行索引返回
df1.col
中的值。如果
df2.col
值不是
df1.col
的成员,则将使用默认的
“不匹配”
值。

在0.13中,可以使用:


您必须首先保证索引匹配。为了简化,我将显示相同数据帧中的列。诀窍是在列轴中使用apply方法:

df = pd.DataFrame({'col1': ['a', 'b', 'c', 'd'],
                   'col2': ['a123','b456','d789', 'a']})
df['contained'] = df.apply(lambda x: x.col1 in x.col2, axis=1)
df
  col1  col2  contained
0    a  a123       True
1    b  b456       True
2    c  d789      False
3    d     a      False

“多重匹配”是什么意思?您是指
'a123a'
中的两个
'a'
,还是指df2['col']的不同行,例如
['a123'、'b456'、'a789']
?后一种情况是不同行匹配我实际上希望它在部分匹配上匹配。因此,在您的示例中,每个值都有一个匹配项。我认为isin不能处理部分匹配。
df = pd.DataFrame({'col1': ['a', 'b', 'c', 'd'],
                   'col2': ['a123','b456','d789', 'a']})
df['contained'] = df.apply(lambda x: x.col1 in x.col2, axis=1)
df
  col1  col2  contained
0    a  a123       True
1    b  b456       True
2    c  d789      False
3    d     a      False