You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于首个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

注意事项

  1. 原代码中每次调用Blocklist().req(key)会重复实例化对象,改成self.req(key)更高效。
  2. 重置索引步骤是可选的,若不需要连续索引可直接去掉。
  3. 两种方案都能达到预期结果,isin方法更简洁,merge方法适合需要查看匹配关系的场景。

内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:11:02