【问题标题】:Creating n-grams for rows in a dataframe with counts in Pandas?在 Pandas 中为数据框中的行创建 n-gram?
【发布时间】:2021-12-22 09:48:45
【问题描述】:

我有以下数据框:

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)

我想创建数据帧的二元组以及它们出现的数据帧中每个日期的计数。 bi-gram 是 2 个单词。

所以我想得到这样的最终结果表:

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'

从上面可以看出,二元组good acting的计数为1,但重复两次,每次出现一次。

或者有没有一种方法可以产生总和?所以我们的值出现为 2 并且只出现一行,可能嵌套了两个日期 - 尽管这可能很难绘制?

生成 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))

上面的代码给了我二元组,但我被困在如何转换数据以获得这些二元组的出现次数以及日期。

感谢任何帮助。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以计算您的 ngram,使用 str.len 获取计数,将 explode 分成多行,最后删除包含空 ngram 的行。

    我提供了一个 n=3 的例子:

    n = 3
    df['ngrams'] = df['words'].str.split().apply(lambda x: list(map(' '.join, ngrams(x, n=n))))
    (df.assign(count=df['ngrams'].str.len())
       .explode('ngrams')
       .query('count > 0')
    )
    

    输出:

                          words       dates             ngrams  count
    0    must watch good acting  2020-01-01    must watch good      2
    0    must watch good acting  2020-01-01  watch good acting      2
    1  average movie bad acting  2020-01-01  average movie bad      2
    1  average movie bad acting  2020-01-01   movie bad acting      2
    2    good movie good acting  2020-01-02    good movie good      2
    2    good movie good acting  2020-01-02  movie good acting      2
    

    【讨论】:

    • 这太棒了!以前从来不知道那些额外的方法!干杯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2022-09-30
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多