Pandas 如何按名称分组筛选不含wikipedia.org链接的企业数据
实现方案
你之前遇到的卡点核心是对groupby的使用场景存在误解:groupby 并非必须配套聚合操作才能使用,除聚合统计场景外,它还支持通过filter方法按组规则直接过滤原始数据,不需要产出聚合结果即可完成组级筛选。
操作步骤
- 逐行判断当前URL是否包含"wikipedia.org",生成临时判断标记
- 按企业名称分组,保留所有关联URL均不含目标域名的企业分组
- 提取符合条件的企业名称,转换为目标列表格式
可直接复用的代码
第一步:生成逐行URL匹配标记
# 对域名中的点做正则转义,避免匹配误差 df['has_wiki'] = df['url'].str.contains(r'wikipedia\.org', na=False)
注:
na=False会将URL缺失值默认判定为不包含维基链接,避免空值干扰判断逻辑。
方法一:用groupby的filter方法直接筛选(无需额外聚合计算)
# 按企业名分组,过滤规则:组内不存在任何带维基链接的记录 filtered_df = df.groupby('name').filter( lambda group: not group['has_wiki'].any() ) # 提取去重后的企业名,生成目标格式列表 result = filtered_df['name'].unique().tolist()
这种方式不需要额外计算聚合统计值,直接输出符合条件的原始数据行,完全适配需求。
方法二:先做聚合统计再反向筛选
# 按企业分组,聚合计算每个企业是否至少存在1条维基链接 name_wiki_flag = df.groupby('name')['has_wiki'].any().reset_index() # 筛选出无维基链接的企业,转成列表 result = name_wiki_flag.loc[name_wiki_flag['has_wiki'] == False, 'name'].tolist()
输出效果
当数据中存在如1-800-Flowers这类所有关联URL都不含维基链接的企业时,最终生成的result会输出为类似['1-800-Flowers']的列表格式,和预期一致。
内容的提问来源于stack exchange,提问作者Wing Shum
相关产品推荐
相关产品推荐

