如何缩减Pandas DataFrame行数?XML站点地图数据处理遇阻
解决站点地图词频数据量过大的问题
1. 修复Slug提取逻辑(核心根源)
你当前的Slug提取逻辑和注释描述完全不符——所有Slugs都只处理了不以/结尾的URL,还错误地把每个URL的倒数两段都拆出来合并,这直接导致大量冗余文本片段生成,是数据量暴增的主要原因。
正确的提取逻辑应该严格匹配你的注释:
- 对以
/结尾的URL,取倒数第二部分作为Slug - 对不以
/结尾的URL,取最后一部分作为Slug
修改后的代码:
import advertools as adv import pandas as pd site = "https://www.halfords.com/sitemap_index.xml" sitemap = adv.sitemap_to_df(site) sitemap = sitemap.dropna(subset=["loc"]).reset_index(drop=True) # 区分两种URL类型提取Slug slash_end = sitemap['loc'].str.endswith('/') # 处理以/结尾的URL,取倒数第二部分 slugs_slash = sitemap.loc[slash_end, 'loc'].str.split('/').str[-2].str.replace('-', ' ') # 处理不以/结尾的URL,取最后一部分 slugs_no_slash = sitemap.loc[~slash_end, 'loc'].str.split('/').str[-1].str.replace('-', ' ') # 合并正确的Slug列表 slugs = pd.concat([slugs_slash, slugs_no_slash]).tolist()
2. 缩减词频数据的实用方案
方法一:过滤低频次Ngram
只保留出现次数达到阈值的词/短语,比如只保留出现≥5次的内容:
word_counts_onegram = adv.word_frequency(slugs) word_counts_twogram = adv.word_frequency(slugs, phrase_len=2) competitor = pd.concat([word_counts_onegram, word_counts_twogram])\ .rename({'abs_freq':'Count','word':'Ngram'}, axis=1)\ .query('Count >= 5')\ # 过滤低频次条目 .sort_values('Count', ascending=False)
方法二:只保留核心Ngram类型
如果不需要同时保留单字和双字词,可以二选一(双字词通常更具实际业务意义):
# 仅生成双字词频统计 word_counts_twogram = adv.word_frequency(slugs, phrase_len=2) competitor = word_counts_twogram.rename({'abs_freq':'Count','word':'Ngram'}, axis=1)\ .sort_values('Count', ascending=False)
方法三:去重重复Ngram
合并单字和双字词后可能存在重复统计项,可按Ngram去重,保留最高频次的条目:
competitor = pd.concat([word_counts_onegram, word_counts_twogram])\ .rename({'abs_freq':'Count','word':'Ngram'}, axis=1)\ .sort_values('Count', ascending=False)\ .drop_duplicates(subset='Ngram', keep='first') # 按Ngram去重,保留次数最多的记录
3. 额外优化:提前过滤无效URL
站点地图可能包含图片、静态资源等非核心页面URL,可提前过滤:
# 只保留包含产品/分类特征的URL(根据实际业务调整关键词) valid_urls = sitemap[sitemap['loc'].str.contains('product|category', case=False)] sitemap = valid_urls.dropna(subset=["loc"]).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Simone De Palma
相关产品推荐
相关产品推荐

