熊猫计算数据框中的单词,另一列中的乘数值

时间:2021-02-16 12:30:18

标签: python pandas

我有一个包含推文的 Pandas 数据框,我有一个列显示这些推文被转发了多少次。当我数词时,我想将它们乘以它们被转发的次数。

例如,对于这张表,我想计算苹果和香蕉 2 次,但要计算菠萝 4 次。所以,总的来说,我想数苹果 6 次,香蕉 2 次。

tweet            retweet
-------------------------
apple banana       2
pineapple apple    4

如果我只想计算推文,我可以这样做

tweet_text = df['tweet'].str.cat(sep=' ')
tokens = nltk.word_tokenize(tweet_text)
most_common = pd.DataFrame(nltk.ngrams(tokens, 1)).value_counts().to_frame()

如果我想要二元组,我可以简单地做:

most_common = pd.DataFrame(nltk.ngrams(tokens, 2)).value_counts().to_frame()

但是如何考虑转发?

2 个答案:

答案 0 :(得分:1)

我试着用字典解决它:

myDict = {}
tweets = pd.DataFrame({'tweet': ['apple bannana', 'pineapple', 'apple strawberry'],
                       'retweet': [2,4,3]})
    for idx, row in tweets.iterrows():
        for i in row['tweet'].split(" "):
            if i in myDict:
                myDict[i] = myDict[i] + row["retweet"]
            else:
                myDict[i] = row["retweet"]
    print(myDict)

输出现在是 {'apple': 5, 'bannana': 2, 'pineapple': 4, 'strawberry': 3} 希望我理解这个问题是正确的。 也许这不是最有效的方式。另一种尝试是使用每条推文的每个词作为行广告创建一个数据框,而不是使用 groupby().sum()。

二元组更新 首先,这里可能是计算单个单词的另一种可能性。

tweets = pd.DataFrame({'tweet': ['apple bannana', 'pineapple', 'apple strawberry'],
                       'retweet': [2,4,3]})
unigrams = (
        tweets['tweet'].str.lower()
            .str.replace(r'[^a-z\s]', '')
            .str.split(expand=True)
            )
unigramDF = pd.DataFrame(unigrams)
unigramDF['retweet'] = tweets['retweet']

unigramDF = pd.melt(unigramDF, id_vars='retweet').drop(['variable'], axis=1).dropna().groupby(['value']).sum()
print(unigramDF)

我使用了这里的一些代码(用于积分):Generate N-Grams from strings with pandas

现在是二元组:

bigrams = []
for idx, row in tweets.iterrows():
    unigrams = (
        row['tweet'].lower().replace(r'[^a-z\s]', '').split((' '))
    )
    for i in range(0,len(unigrams)-1):
        bigrams.append([unigrams[i] + ' ' + unigrams[i+1], row['retweet']])
bigramDF = pd.DataFrame(bigrams, columns=['bigram', 'retweet'])
bigramDF.groupby(['bigram']).sum()
print(bigramDF)

现在有了这两个数据框,计算概率应该不会太困难。

答案 1 :(得分:1)

我有一个类似的问题,我需要计算消息中单词的出现次数。如果您想在单个推文(数据帧的一个单元格)中计算单词出现次数,那么这将起作用

def word_frequency(str):
    counts = dict()
    words = str.split()

    for word in words:
        if word in counts:
            counts[word] += 1
        else:
            counts[word] = 1
    return counts

这将返回一个字典,其中单词作为键,它们的计数作为值,您可以将其应用于推文列。

然后你可以用它来理解数据

##lists for storing output of words and associated counts
words = []
occurrence = []

##add words and counts to above lists
for comment in comments:
    for key in word_frequency(comment).keys():
        words.append(key)
    for value in word_frequency(comment).values():
        occurrence.append(value)

import pandas as pd
measure = pd.DataFrame({'word':words, 'occurrence':occurrence})

对于 bigrams(或任何 ngram),可以通过稍微改变 word_frequency 函数来完成,然后其余的代码应该仍然可以工作

def ngrams_word_frequency(ngram):
    counts = dict()

    for gram in ngram:
        words = ' '.join(word for word in gram)
        if words in counts:
            counts[words] += 1
        else:
            counts[words] = 1
    return counts

这需要你给 ngrams_word_frequency 函数一个列表列表,对于我的个人项目,我创建了一个 ngrams 函数:

def ngrams(str, n):
    str = str.split()
    output = [str[i:i+n] for i in range(len(str)-n+1)]
    return output
相关问题