You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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-gramcountdate
must watch12020-01-01
watch good12020-01-01
good acting12020-01-01
average movie12020-01-01
movie bad12020-01-01
bad acting12020-01-01
good movie12020-01-02
movie good12020-01-02
good acting12020-01-02
pathetic avoid12020-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:06:07