[英]How to search a string in one pandas dataframe column as a substring in another dataframe column
[英]How to search a string in one pandas dataframe column as a substring in another dataframe
我有兩個熊貓數據框 df1 和 df2。 我需要通過搜索 df2['B'] 在 df1 中創建一個新列,以查看 df1['A'] 是否是 df2['B'] 的子字符串,反之亦然。 如果有匹配項,則為 df1['B'] 中的新列返回 df2['A'] 的值。
以下是示例數據框
df1
A B
8GSHDK1 ?
SDFAGHJFDJ GSHJGGFV
678HJDGGH
576GHJHJJKHJJH
YRYWEUIYWRE
df2
A B
1 GSHJGGFV
2 XXXYYYYY
3 8GSHDK1 TO BE DEL
在這種情況下合並不起作用,因為 df1['A'] 包含 df2['B'] 的子字符串或 df2['B'] 包含 df1['A'] 的子字符串。
我在下面嘗試過,但它運行了 7 到 8 個小時。 df1 有 25k 條記錄,df2 有 720k 條記錄
df1['B']=df1['A'].apply(lambda x: df2[df2['B'].str.contains(x) | df2['B'].apply(lambda y : y in x)]['B'].any())
任何幫助將不勝感激。 預期輸出:
df1
A B
8GSHDK1 8GSHDK1 TO BE DEL
SDFAGHJFDJ GSHJGGFV GSHJGGFV
678HJDGGH None
576GHJHJJKHJJH None
YRYWEUIYWRE None
可以在您的代碼中避免使用多個 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
我嘗試使用LCS算法,我的邏輯是:
如果有兩個字符串 A 和 B,一個可以是另一個的子串:
iff, 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.