【问题标题】:Using Counter() function in python在 python 中使用 Counter() 函数
【发布时间】:2021-04-09 00:28:36
【问题描述】:

我有一个包含许多行和列的 excel 文件。我想做以下事情。首先,我想根据文本匹配过滤行。其次,我想选择一个特定的列并为该列中的所有单词生成词频。第三,我要绘制单词和频率。

我已经弄清楚了第一部分。我的问题是如何在数据框上应用 Counter() 。如果我只使用 Counter(df),它会返回一个错误。因此,我使用以下代码将每一行转换为一个列表,然后应用 Counter。当我这样做时,我会分别获得每一行的词频(如果我在 for 循环中使用计数器,否则我只会得到一行的词频)。但是,我想要将所有行放在一起的字数。感谢任何输入。谢谢! 以下是示例数据。

product      review
a            Great Product
a            Delivery was fast 
a            Product received in good condition
a            Fast delivery but useless product
b            Dont recommend
b            I love it
b            Please dont buy
b            Second purchase

我想要的输出是这样的:对于产品 a - (product,3),(delivery,2)(fast,2) etc..我当前的输出就像 (great,1), (product,1) for第一行。

这是我使用的代码。

strdata = column.values.tolist() 
tokens = [tokenizer.tokenize(str(i)) for i in strdata] 

cleaned_list = []
for m in tokens:
    stopped = [i for i in m if str(i).lower() not in stop_words] 
    stemmed = [stemmer.stem(i) for i in stopped] 
    cleaned_list.append(stopped) #append stemmed words to list
    count = Counter(stemmed)
    print(count.most_common(10))

【问题讨论】:

  • 样本数据和预期输出?
  • 不确定如何在此处发布表格。这正是我的问题,但解决方案似乎不起作用。 stackoverflow.com/questions/46786211/…
  • 您可以编辑您的问题并将表格放入代码围栏中。

标签: python dataframe counter


【解决方案1】:

首先,使用 groupby 连接来自同一组的字符串。

其次,在连接的字符串上应用Counter()

joined = df.groupby('product', as_index=False).agg({'review' : ' '.join})
joined['count'] = joined.apply(lambda x: collections.Counter(x['review'].split(' ')), axis=1)
# print(joined)

  product                                             review                                              count
0       a  Great Product Delivery was fast Product receiv...  {'Great': 1, 'Product': 2, 'Delivery': 1, 'was...
1       b  Dont recommend I love it Please dont buy Secon...  {'Dont': 1, 'recommend': 1, 'I': 1, 'love': 1,...

【讨论】:

    【解决方案2】:

    您可以使用以下功能。这个想法是

    1. byvar 对您的数据进行分组。将yvar 中的每个单词组合成一个列表。
    2. 申请Counter,如果需要,选择最常见的
    3. 展开以获得长格式数据帧(之后更易于分析)
    4. 只需保留相关列(wordcount 在新数据框中) :
    from collections import Counter
    import pandas as pd
    
    def count_words_by(data, yvar, byvar):
        cw = pd.DataFrame({'counter' : data
            .groupby(byvar)
            .apply(lambda s: ' '.join(s[yvar]).split())
            .apply(lambda s: Counter(s))
    #        .apply(lambda s: s.most_common(10)) #uncomment this line if you want the top 10 words
            .explode()}
        )
        cw[['word','count']] = pd.DataFrame(cw['counter'].tolist(), index=cw.index)
        cw_red = cw[['word','count']].reset_index()
    
        return cw_red
    
    count_words_by(data = df, yvar = "review", byvar = "product")
    

    我假设你从那里开始:

    product      review
    a            Great Product
    a            Delivery was fast 
    a            Product received in good condition
    a            Fast delivery but useless product
    b            Dont recommend
    b            I love it
    b            Please dont buy
    b            Second purchase
    

    【讨论】:

    • 谢谢!我无法理解这段代码的某些部分..但是,它有效!
    • 我添加了一些解释来帮助你弄清楚这个想法
    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    相关资源
    最近更新 更多