感谢您花时间阅读我的问题。
我正在开发一个能够实时执行自定义网络流量监控的系统。系统(在其当前的alpha迭代中)每隔几分钟就会收集一次.txt流量转储。我叫它df_webtraffic。此.txt包含多个列,其中一列是Web流量的url字段。我需要做的是,对于每一行的url条目(df_webtraffic.url),扫描另一个df(或系列,我不知道它有多重要,因为它只是一列)被禁止的网站(我称之为黑名单) )。黑名单很大(近百万条),因此效率非常重要。
我已经阅读过几十个论坛帖子,但大多数主题似乎与查找特定字符串有关,而不是在系列中查找匹配项。如何扫描一个数据字段中的列并在另一个数据字段或系列中查找相应的匹配项?
我已经写了这个片段:print y[y['URL'].str.contains[(blacklist)]
它似乎有效......但它永远不会完成。它只是处理...和处理......和处理 - 我期望,但是系统监视器显示我的处理器几乎没有突破5%的python进程,从不超过10%,并且定期处于0%。对于这个要求很高的东西,我希望它能消耗大量的CPU。
思想?
德鲁
更新:
我不清楚的一件事是,黑名单中的域并不总是与点击的网址完全匹配 - 有人可能会点击指向域内子目录的网址(如www。 website.com/subdir/link.html),但我需要与之对应的黑名单条目可能只是www.website.com。因此,我需要查看点击的网址中的条目是否包含黑名单中的任何条目,即使它没有明确匹配它。
答案 0 :(得分:0)
我建议为黑名单创建一个哈希表。这包括使用一些算法将url转换为数字(例如,使用每个字符的ascii代码),然后除以一个大的素数。素数越大,冲突次数越少。哈希表将包含结果数字,字符串和一系列冲突的指针。您需要一个相当长的过程来设置哈希表开始,但如果冲突的数量很少,查找过程应该很快。
有关散列算法的更多详细信息,请访问:https://en.wikipedia.org/wiki/Hash_function
答案 1 :(得分:0)
为了在大型数据集中复制您的任务,我下载了documentation of the new version中所有贡献的csv file作为示例。
我首先导入Pandas DataFrame。
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
现在只包含贡献者邮政编码不在黑名单中的行。