列包含列
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)
我想看看在我的数据框的每一行中,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)