基于首个DataFrame移除字典中其他DataFrame的重复域名
移除DataFrame中与ads_malware重复的域名项
你的需求是剔除其他DataFrame中与ads_malware重复的域名记录,下面提供两种基于pandas的实现方案,包含你提到的pd.merge方法。
核心思路
先提取ads_malware中的所有域名作为基准黑名单,再遍历字典内的其他DataFrame,过滤掉出现在基准黑名单里的域名记录。
方案1:用isin快速过滤(简洁高效)
这种方法代码更简洁,性能表现也更优,适合大多数场景:
修改你的insert方法,在加载完所有DataFrame后添加清理逻辑:
def insert(self): dic = { ADWARE_MALWARE: "ads_malware", FAKENEWS: "fakenews", GAMBLING: "gambling", PORN: "porn", SOCIAL: "social" } d = {} # 加载所有黑名单数据到字典 for key, value in dic.items(): blocklist = self.req(key) d[value] = self.create_df(blocklist, value) # 提取ads_malware的域名列表作为基准 ads_domains = d['ads_malware']['Domain'] # 清理其他DataFrame的重复项 for df_name in d: if df_name != 'ads_malware': # 保留不在ads_malware里的域名 d[df_name] = d[df_name][~d[df_name]['Domain'].isin(ads_domains)] # 重置索引(可选,让索引从0开始) d[df_name] = d[df_name].reset_index(drop=True) # 打印处理后的结果 for df in d.values(): print(df) return d
方案2:用pd.merge实现匹配过滤
如果必须使用pd.merge,可以通过左连接+匹配标记的方式筛选出不重复的记录:
def insert(self): dic = { ADWARE_MALWARE: "ads_malware", FAKENEWS: "fakenews", GAMBLING: "gambling", PORN: "porn", SOCIAL: "social" } d = {} # 加载所有黑名单数据到字典 for key, value in dic.items(): blocklist = self.req(key) d[value] = self.create_df(blocklist, value) # 提取ads_malware的域名列表作为基准(保留DataFrame格式) ads_domains = d['ads_malware'][['Domain']] # 清理其他DataFrame的重复项 for df_name in d: if df_name != 'ads_malware': # 左连接,添加_merge标记区分匹配情况 merged_df = pd.merge( d[df_name], ads_domains, on='Domain', how='left', indicator=True ) # 只保留仅在当前DataFrame存在的记录 d[df_name] = merged_df[merged_df['_merge'] == 'left_only'].drop('_merge', axis=1) # 重置索引(可选) d[df_name] = d[df_name].reset_index(drop=True) # 打印处理后的结果 for df in d.values(): print(df) return d
注意事项
- 原代码中每次调用
Blocklist().req(key)会重复实例化对象,改成self.req(key)更高效。 - 重置索引步骤是可选的,若不需要连续索引可直接去掉。
- 两种方案都能达到预期结果,
isin方法更简洁,merge方法适合需要查看匹配关系的场景。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

