2016-03-12 30 views
0

感謝您花時間閱讀我的問題。Python Pandas - 在特定列中搜索兩個數據幀以匹配字符串

我正在開發一個可以實時自定義Web流量監控的系統。系統(在其當前的alpha迭代中)每隔幾分鐘就會有一次.txt的流量轉儲。我會叫它df_webtraffic。這個.txt有幾列,其中一個是網絡流量的url字段。我需要做的是,對於每一行的URL輸入(df_webtraffic.url),掃描另一個df(或系列,我不知道它有多重要,因爲它只是一列)被禁止的網站(我稱之爲黑名單)。黑名單很大(近一百萬條),所以效率非常重要。

我已經閱讀了數十篇論壇帖子,但大多數主題似乎都與找到一個特定的字符串有關,而不是在一個系列中找到匹配。如何掃描一個數據字段中的列並查找其他數據字段或系列中的相應匹配項?

我已經寫了這段代碼:print y[y['URL'].str.contains[(blacklist)]它看起來可以工作......但它從來沒有完成。它只是處理......和處理......以及處理 - 我期望得到,但系統監視器顯示我的處理器幾乎不會突破python進程的5%,從不超過10%,並且定期處於0%。對於這樣的要求我期望它會消耗大量的CPU。

想法?

德魯

UPDATE:

有一件事我不是清楚的是,在黑名單域並不總是將是一個精確匹配的點擊網址 - 有人可以點擊網址它指向一個域內的子目錄(如www.website.com/subdir/link.html),但是我需要與之對應的黑名單條目只能是www.website.com。因此,我需要查看點擊的URL中的條目是否包含黑名單中的任何條目,即使它沒有明確地匹配它。

回答

0

我建議爲黑名單創建一個哈希表。這包括使用一些算法將網址轉換爲數字(例如,使用每個字符的ASCII代碼),然後除以大的素數。素數越大,衝突次數越少。哈希表將包含結果編號,字符串和一連串衝突的指針。您需要一個相當長的過程來設置哈希表開始,但如果衝突次數少,查找過程應該很快。

對哈希算法的更多細節,可以發現:https://en.wikipedia.org/wiki/Hash_function

+0

感謝您的想法。有一件事我看起來並不清楚,黑名單中的域名並不完全匹配 - 有人可能會點擊指向域中子目錄的URL(例如www.website.com/ subdir/link.html),但是我需要與之對應的黑名單條目只能是www.website.com。有任何建議嗎? –

0

在努力複製你的任務在一個大的數據集,我下載的所有貢獻的csv file2016 Presidential Campaign Finance作爲例子來使用。

我首先導入到熊貓數據框中。

import pandas as pd 

funding = pd.read_csv('P00000001-ALL.csv') 

我,然後隨機選擇10000個貢獻者郵政編碼爲黑名單

zip_list = funding['contbr_zip'].unique() 
blacklist = pd.DataFrame(zip_list, columns=['contbr_zip']).sample(n=10000) 

過濾發生在這裏:

selection = funding['contbr_zip'].isin(blacklist['contbr_zip']) 
filtered_df = funding[~selection] 

filtered_df現在只包含行,其中貢獻者郵政編碼不在黑名單中。

+0

我玩過.isin。有一件事我看起來並不清楚,黑名單中的域名並不完全匹配 - 有人可能會點擊指向域中子目錄的URL(例如www.website.com/ subdir/link.html),但是我需要與之對應的黑名單條目只能是www.website.com。 我目前的代碼使用str.contains,因爲我需要單擊的url來包含黑名單中的任何條目 - 不能明確地匹配它。對此有任何想法? –

+0

我會盡量減少比較以確保匹配速度。把你的URL列表放到核心域中怎麼樣?這是否符合你的邏輯?將URL列表減少爲某種標準格式將使比較更加精簡。 – gauden

相關問題