列包含列

Column contains column

我想看看在我的数据框的每一行中,A 列是否包含 B 列中的值。

df = pd.DataFrame({'A': ["Is it 54321?", "Is it 4321?", "Is it 321?"],
                   'B': [54321, 54321, 54321]})

我试过了:

df["C"] = df["A"] .str .contains(df["B"])

我愿意:

'C': [1,0,0]

但是我得到了:

TypeError: 'Series' objects are mutable, thus they cannot be hashed

我发现它作为一个函数工作:

def fun (A,B):
    if str(B) in A:
        return 1
    else:
        return 0
f = np.vectorize(fun, otypes=[float])
df["C"] = f(df['A'],df['B'])

这是另一种方法:

df['C'] = (df['B'] == df['A'].str.rstrip('?').str.split(' ').str[-1].astype(int)) * 1

您可以简化代码:

def fun (A,B):
    return str(B) in str(A) # Edit: A to str(A)

f = np.vectorize(fun, otypes=[int])
df["C"] = f(df['A'],df['B'])

或使用列表理解:

df["C"] = [int(str(B) in A) for A, B in zip(df['A'],df['B'])]

或者:

df['C']=df.A.str.contains(r'\b(?:{})\b'.format('|'.join(df.B.astype(str)))).astype(int)
print(df)

              A      B  C
0  Is it 54321?  54321  1
1   Is it 4321?  54321  0
2    Is it 321?  54321  0

我已经接受了此线程上的各种答案,但我遇到了问题,如下所述:

感谢文奔的解答:

如果您确实希望 12 在 123 中:

df = df.dropna()
df['C'] = [str(y) in x for x , y in zip(df.A,df.B)]
print(df)

或者如果您不希望 12 出现在 123 中:

df = df.dropna()
df['C'] = [str(y) in x for x , y in zip(df.A.str.split(' '),df.B)]
print(df)