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條經驗 獲得超4個贊
我認為您正在尋找的是pandas.concat。
df?=?pd.concat([df1['A'],?df2['B']],?axis=1)
之后您可以使用 apply ,其邏輯與您在問題中所寫的類似。
- 3 回答
- 0 關注
- 171 瀏覽
添加回答
舉報