亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

PHP
白衣染霜花 2023-11-09 21:07:06
我有兩個 pandas 數據框 df1 和 df2。我需要通過搜索 df2['B'] 來查看 df1['A'] 是否是 df2['B'] 的子字符串,在 df1 中創建一個新列,反之亦然。如果存在匹配,則返回 df1['B'] 中新列的 df2['A'] 值。以下是示例數據框df1  A                     B       8GSHDK1               ?  SDFAGHJFDJ GSHJGGFV  678HJDGGH  576GHJHJJKHJJH  YRYWEUIYWREdf2 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
查看完整描述

3 回答

?
DIEA

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


查看完整回答
反對 回復 2023-11-09
?
FFIVE

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


查看完整回答
反對 回復 2023-11-09
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

我認為您正在尋找的是pandas.concat。

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

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


查看完整回答
反對 回復 2023-11-09
  • 3 回答
  • 0 關注
  • 171 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號