Pandas dataframe按日期分组应用自定义函数生成词频统计新表方案
解决方案
第一步:优化process_title方法
原有方法中使用try-except包裹remove操作存在两个缺陷:一是只能删除首个匹配的目标词,若文本中多次出现google/search/-会有残留;二是笼统捕获所有异常容易隐藏其他未知错误。优化后采用列表过滤逻辑,稳定性更强:
from nltk.tokenize import word_tokenize from nltk.stem import WordNetLemmatizer from nltk.corpus import stopwords import pandas as pd stop_words = set(stopwords.words('english')) lemmatizer = WordNetLemmatizer() def process_title(text): tokens = word_tokenize(text.lower()) # 直接过滤不需要的词汇,替代原有remove逻辑 filter_tokens = [w for w in tokens if w not in {'google', 'search', '-'}] lemm_tokens = list(map(lemmatizer.lemmatize, filter_tokens)) # 额外加长度校验,过滤掉空字符串 without_stop = [word for word in lemm_tokens if word not in stop_words and len(word.strip())>0] return without_stop
第二步:生成目标DataFrame
# 1. 对每个标题做预处理,得到处理后的单词列表 df_org['processed_words'] = df_org['Titles'].apply(process_title) # 2. 拆分单词列表为单行单个单词,保留对应日期 df_explode = df_org.explode('processed_words').rename(columns={'processed_words': 'Word'}) # 3. 过滤空值,避免无效统计 df_explode = df_explode.dropna(subset=['Word']) # 4. 按日期+单词分组统计频次,整理为要求的结构 result_df = df_explode.groupby(['Dates', 'Word'], as_index=False)\ .size()\ .rename(columns={'size': 'Frequency', 'Dates': 'Date'}) # 5. 调整列顺序为要求的[Word, Frequency, Date] result_df = result_df[['Word', 'Frequency', 'Date']]
逻辑说明
- 先通过
apply批量处理所有标题,得到每个标题对应的清洗后单词列表 - 用
explode方法将列表型的单词列拆分为多行,每个单词单独占一行,同时保留该标题对应的日期 - 过滤空值后按日期和单词两个维度分组,统计每个分组的行数即为该单词在对应日期的出现频次
- 最后调整列名和列顺序,得到符合要求的结果
内容的提问来源于stack exchange,提问作者arjunsiva
相关产品推荐
相关产品推荐

