簡體   English   中英

檢查是否有任何 pandas dataframe 列值在另一個 pandas Z6A8064B5DF47945550DZ5列53C4

[英]Check if any pandas dataframe column values are within another pandas dataframe column

我的 df1 公司名稱很亂:

     messyCompany        
0    google123xyz              
1     amazon12345
2       amzn12345
3   mcdonalds inc      
4  healthtech ltd 
      

df2 具有干凈的公司名稱和相應的關鍵字:

     cleanCompany  keywords        
0          Amazon    amazon           
1          Amazon      amzn    

我想檢查 df1 中的 messyCompany 是否包含 df2 中的任何關鍵字值,如果是,請輸入干凈的公司名稱。 例如:

     messyCompany     cleanCompany  
0    google123xyz              
1     amazon12345           Amazon
2       amzn12345           Amazon
3   mcdonalds inc      
4  healthtech ltd 

我首先嘗試使用兩個 for 循環; 一個循環遍歷 messyCompany 名稱,每個值循環遍歷關鍵字。 但這非常慢。

然后我嘗試用apply替換一個for循環:

def search(x):
   for i in range(df2.shape[0]):
      if df2['keywords'] in df1['messyCompany']:
         return df2['cleanCompany']

df1['cleanCompany'] = df1.apply(lambda x: search(x), axis=1)

這更快但總體上仍然很慢(實際的df有數千行)。 我嘗試使用嵌套在另一個應用中的應用,但這比較慢。 我一直在閱讀很多如何優化熊貓(應用、矢量化、分塊等),但我似乎找不到優化所需雙循環的最佳方法。 這種類型的雙循環是否有最佳實踐?

我會使用str.extractmap結果:

df = pd.DataFrame({'messyCompany': {0: 'google123xyz', 1: 'amazon12345', 2: 'amzn12345', 3: 'mcdonalds inc', 4: 'healthtech ltd'}})
ref = pd.DataFrame({'cleanCompany': {0: 'Amazon', 1: 'Amazon'}, 'keywords': {0: 'amazon', 1: 'amzn'}})

df["found"] = (df["messyCompany"].str.extract("("+"|".join(ref["keywords"])+")", expand=False)
                 .map(ref.set_index("keywords")["cleanCompany"]))

print (df)

     messyCompany   found
0    google123xyz     NaN
1     amazon12345  Amazon
2       amzn12345  Amazon
3   mcdonalds inc     NaN
4  healthtech ltd     NaN

暫無
暫無

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

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