如何在Pandas中为DataFrame行生成bi-gram并按日期统计出现次数
问题描述
我有如下DataFrame:
import pandas as pd data = {'words': ['must watch good acting', 'average movie bad acting', 'good movie good acting', 'pathetic avoid', 'avoid'], 'dates': ['2020-01-01','2020-01-01','2020-01-02','2020-01-02', '2020-01-03']} df = pd.DataFrame.from_dict(data)
需要为该DataFrame生成2词的bi-gram,同时统计每个bi-gram在其出现日期对应的计数,期望结果如下:
| bi-gram | count | date |
|---|---|---|
| must watch | 1 | 2020-01-01 |
| watch good | 1 | 2020-01-01 |
| good acting | 1 | 2020-01-01 |
| average movie | 1 | 2020-01-01 |
| movie bad | 1 | 2020-01-01 |
| bad acting | 1 | 2020-01-01 |
| good movie | 1 | 2020-01-02 |
| movie good | 1 | 2020-01-02 |
| good acting | 1 | 2020-01-02 |
| pathetic avoid | 1 | 2020-01-02 |
如上所示,bi-gram good acting 出现两次,分别对应不同日期各计数1。
另外还需要得到总计数的结果:即相同bi-gram仅出现一行,count为总出现次数,嵌套关联所有出现的日期。
我已有生成n-gram的基础代码:
from nltk import ngrams sentence = 'test sentence' # set n =2 for bi grams n = 2 bigrams = ngrams(sentence.split(), n) print(list(bigrams))
不知道如何转换数据得到bi-gram的出现计数并关联对应的日期。
实现代码
from nltk import ngrams import pandas as pd # 定义生成bigram的函数 def get_bigrams(text): words = text.split() # 词数少于2的句子无法生成bigram,返回空列表 if len(words) < 2: return [] # 把ngrams的元组转成空格连接的字符串 return [' '.join(gram) for gram in ngrams(words, 2)] # 1. 为每行生成bigram列表 df['bigram'] = df['words'].apply(get_bigrams) # 2. 展开bigram列表,每个bigram单独一行,过滤无效值 df_exploded = df.explode('bigram').dropna(subset=['bigram']).drop(columns=['words']) # 3. 按日期+bi-gram分组统计,得到按日期拆分的计数结果 date_count = df_exploded.groupby(['bigram', 'dates'], as_index=False).size().rename(columns={'size':'count'}) # 调整列顺序匹配期望格式 date_count = date_count[['bigram', 'count', 'dates']].rename(columns={'dates':'date'}) # 4. 按bi-gram汇总总计数,同时关联所有出现日期 total_count = df_exploded.groupby('bigram', as_index=False).agg( total_count=('bigram', 'count'), appear_dates=('dates', lambda x: list(x.unique())) # 去重保留所有出现过的日期 )
结果说明
date_count就是按日期统计bi-gram计数的结果,和你给出的期望输出完全一致total_count是按bi-gram汇总的结果,total_count列是该bi-gram的总出现次数,appear_dates列是列表格式,存储了该bi-gram所有出现过的日期
内容的提问来源于stack exchange,提问作者Beans On Toast
相关产品推荐
相关产品推荐

