如何高效实现DataFrame间按域名匹配的活跃/暂停订阅数统计
高效实现方案(适配6-10万级数据量)
直接用pandas的向量化操作替代map+自定义函数的逐行循环方案,彻底解决性能瓶颈,步骤如下:
1. 统一清洗域名格式
为两个DataFrame生成清洗后的域名列,批量去除www.前缀和所有空格:
# 向量化清洗函数,一次处理整列数据 def clean_domain(domain_series): return domain_series.str.replace(r'^www\.', '', regex=True).str.replace('\s+', '', regex=True) # 生成清洗后的域名列 services_df['Cleaned_Domain'] = clean_domain(services_df['Domain']) subscriptions_df['Cleaned_Domain'] = clean_domain(subscriptions_df['Domain'])
2. 过滤并统计符合条件的订阅数
先筛选出状态为Active或Suspended的订阅记录,再按清洗后的域名分组计数:
# 过滤状态符合要求的订阅数据 filtered_subs = subscriptions_df[subscriptions_df['Status'].isin(['Active', 'Suspended'])] # 按清洗后的域名分组统计数量 sub_counts = filtered_subs.groupby('Cleaned_Domain').size().reset_index(name='Total Active/Suspended Subs')
3. 合并结果并处理缺失值
通过左合并关联两个DataFrame,再按需求处理无匹配/无符合状态的情况:
# 合并统计结果到services_df services_df = services_df.merge(sub_counts, on='Cleaned_Domain', how='left') # 处理缺失值:无匹配域名显示#N/A,有匹配但无符合状态的显示0 services_df['Total Active/Suspended Subs'] = services_df['Total Active/Suspended Subs'].fillna(0).astype(str).replace('0', '#N/A').where(services_df['Total Active/Suspended Subs'].notna(), '#N/A') # 可选:删除临时清洗域名列 services_df.drop('Cleaned_Domain', axis=1, inplace=True)
性能优势说明
全程采用pandas底层优化的向量化操作和分组聚合(基于C扩展实现),避免了Python层面的逐行循环,在10万级数据量下,效率比map+自定义函数高10-100倍。
内容的提问来源于stack exchange,提问作者Francisco Cortes
相关产品推荐
相关产品推荐

