簡體   English   中英

如何在一個 Pandas 數據幀列中搜索字符串作為另一個數據幀中的子字符串

[英]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

我想你要找的是pandas.concat

df = pd.concat([df1['A'], df2['B']], axis=1)

之后您可以使用應用,其邏輯與您在問題中所寫的類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM