3 回答
TA贡献1820条经验 获得超2个赞
我尝试使用LCS算法,我的逻辑是:
如果有两个字符串 A 和 B,其中一个可以是另一个的子串:
当且仅当,len(LCS(A,B))=min(len(A),len(B))
因此,我不是以两种方式匹配子字符串,而是以两种方式进行匹配。也许您需要稍微优化实现,但可以肯定它比双向搜索更快。
代码
%%time
from functools import lru_cache
@lru_cache(maxsize=2048)
def checkele(A, B):
return ((len(B) >= len(A)) and (A in B)) or ((len(A) >= len(B)) and (B in A))
def check(A, Bs):
for B in Bs:
if checkele(*sorted([A, B])):
return B
return None
df1['B']=df1.A.apply( lambda x: check(x, df2.B))
df1
TA贡献1797条经验 获得超6个赞
您的代码中可以避免使用多个 apply 语句,并将其简化如下。这应该运行得更快。
df1['B'] = df1['A'].apply(lambda x: [y for y in df2['B'] if x.upper() in y.upper() or y.upper() in x.upper()]).str[0]
这打印:
A B
0 8GSHDK1 8GSHDK1 TO BE DEL
1 SDFAGHJFDJ GSHJGGFV GSHJGGFV
2 678HJDGGH NaN
3 576GHJHJJKHJJH NaN
4 YRYWEUIYWRE NaN
TA贡献1872条经验 获得超3个赞
我认为您正在寻找的是pandas.concat。
df = pd.concat([df1['A'], df2['B']], axis=1)
之后您可以使用 apply ,其逻辑与您在问题中所写的类似。
- 3 回答
- 0 关注
- 117 浏览
添加回答
举报