【问题标题】:how to count specific words from a pandas Series?如何计算熊猫系列中的特定单词?
【发布时间】:2019-02-12 18:30:56
【问题描述】:

我正在尝试计算来自 pandas DataFrame 的关键字数量:

df = pd.read_csv('amazon_baby.csv')
selected_words = ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate']

selected_words 必须从系列中计算:df['review']

我试过了

def word_counter(sent):
a={}
for word in selected_words:
    a[word] = sent.count(word)
return a

然后

df['totalwords'] = df.review.str.split()
df['word_count'] = df.totalwords.apply(word_counter)

----------------------------------------------------------------------------
----> 1 df['word_count'] = df.totalwords.apply(word_counter)

c:\users\admin\appdata\local\programs\python\python36\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
   3192             else:
   3193                 values = self.astype(object).values
-> 3194                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   3195 
   3196         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/src\inference.pyx in pandas._libs.lib.map_infer()

<ipython-input-51-cd11c5eb1f40> in word_counter(sent)
  2     a={}
  3     for word in selected_words:
----> 4         a[word] = sent.count(word)
  5     return a

AttributeError: 'float' object has no attribute 'count'

有人可以帮忙吗? 我猜这是因为系列中的一些错误值不是字符串。 . .

有些人尝试过提供帮助,但问题是 DataFrame 中的各个 单元格 中有句子。

我需要提取所选单词的计数,最好以字典的形式,并将它们存储在具有相应行的同一 dataFrame 中的新列中。

Data in csv format

【问题讨论】:

  • 欢迎来到 SO。你能提供一个示例代码吗?
  • 发布您的数据框
  • 添加了 csv 文件链接。
  • selected_words 必须从一个句子中提取出来。我添加了 csv 文件,虽然它有点大。格式为 df = DataFrame(columns = ['name','review','评分'])。 & df['review'] 有评论,即从中提取 count 的句子,df['word_count'][i] = df["review"][i] 中每个 selected_word 的计数
  • 在excel中添加了csv文件的快照

标签: python python-3.x pandas attributeerror


【解决方案1】:

假设您的数据框如下所示,

df=pd.DataFrame({'A': ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate','great', 'fantastic', 'amazing', 'love', 'horrible']})
print(df)
    A
0   awesome
1   great
2   fantastic
3   amazing
4   love
5   horrible
6   bad
7   terrible
8   awful
9   wow
10  hate
11  great
12  fantastic
13  amazing
14  love
15  horrible

selected_words=['awesome','great','fantastic']

df.loc[df['A'].isin(selected_words),'A'].value_counts()
[out]
great        2
fantastic    2
awesome      1
Name: A, dtype: int64

【讨论】:

  • selected_words 必须从一个句子中提取出来。我添加了 csv 文件,虽然它有点大。格式为 df = DataFrame(columns = ['name','review','评分'])。 & df['review'] 有评论,即从中提取 count 的句子,df['word_count'][i] = df["review"][i] 中每个 selected_word 的计数
  • 使用 df.loc[df['A'].str.contains('|'.join(selected_words)),'A'].value_counts() 并告诉我或发布一个简单的 5 行数据框并发布其预期输出 df
【解决方案2】:

在循环中重复 list.count 会起作用,尽管效率低下,但具有 list 的值。复杂度为 O(m x n),其中 m 是选定值的数量,n 是值的总数。

使用 Pandas,您可以使用优化的方法来确保 O(n) 复杂度。在这种情况下,您可以使用value_counts 后跟reindex

res = df['A'].value_counts().reindex(selected_words)

print(res)

awesome      1
great        2
fantastic    2
Name: A, dtype: int64

或者,根据@pyd's solution,先过滤,然后使用value_counts。两种解决方案都将具有 O(n) 复杂度。

【讨论】:

    【解决方案3】:

    在您的问题中,您似乎正在为计数实施 dict。 @pyd 发布了一个很好的计数解决方案。产生的结果不是字典。如果您正在寻找字典作为输出,请查看下面发布的这段代码,它基本上是 pyd 提供的解决方案的扩展。

    df=pd.DataFrame({'A': ['awesome', 'great', 'fantastic', 'amazing', 'love', 'horrible', 'bad', 'terrible', 'awful', 'wow', 'hate','great', 'fantastic', 'amazing', 'love', 'horrible']})
    
    def get_count_dict(data, selected_words):
    
        count_dict = {}
    
        counts = data.loc[data['A'].isin(selected_words), 'A'].value_counts()
    
        for i in range(len(counts.index.tolist())):
            count_dict[counts.index.tolist()[i]] = counts[i]
    
        return count_dict
    
    selected_words=['awesome','great','fantastic']
    
    get_count_dict(df, selected_words)
    
    Output : {'fantastic': 2, 'great': 2, 'awesome': 1}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多