我试图获得df中出现次数最多的单词的计数,并按其他列值分组:

我有这样一个数据帧:

df=pd.DataFrame({'Category':['Red','Red','Blue','Yellow','Blue'],'Text':['this is very good ','good','dont like','stop','dont like']})

enter image description here

这是我计算文本列中关键字的方式:

from collections import Counter

top_N = 100


stopwords = nltk.corpus.stopwords.words('english')
# # RegEx for stopwords
RE_stopwords = r'\b(?:{})\b'.format('|'.join(stopwords))
# replace '|'-->' ' and drop all stopwords
words = (df.Text
           .str.lower()
           .replace([r'\|', RE_stopwords], [' ', ''], regex=True)
           .str.cat(sep=' ')
           .split()
)

# generate DF out of Counter
df_top_words = pd.DataFrame(Counter(words).most_common(top_N),
                    columns=['Word', 'Frequency']).set_index('Word')
print(df_top_words)

这就产生了这个结果:

然而,这只是生成了数据框中所有单词的列表,我想要的是以下内容:

推荐答案

words语句会在整列的文本中找到您关心的单词(删除stopwords).我们可以稍微改变一下,在每一行上应用替换:

df["Text"] = (
    df["Text"]
    .str.lower()
    .replace([r'\|', RE_stopwords], [' ', ''], regex=True)
    .str.strip()
    # .str.cat(sep=' ')
    .str.split()  # Previously .split()
)

导致:

  Category          Text
0      Red        [good]
1      Red        [good]
2     Blue  [dont, like]
3   Yellow        [stop]
4     Blue  [dont, like]

现在,我们可以使用.explode.groupby.size将每个列表元素展开到它自己的行,然后计算每个(原始)行的文本中出现一个单词的次数:

df.explode("Text").groupby(["Category", "Text"]).size()

导致:

Category  Text
Blue      dont    2
          like    2
Red       good    2
Yellow    stop    1

现在,这与您的输出示例不匹配,因为在该示例中,您没有应用原始words语句中的.replace步(现在用于计算"Text"列的新值).如果你想得到这个结果,你只需要把那.replace行注释掉(但我想这就是这个问题的重点)

Python相关问答推荐

有条件地采样我的大型DF的最有效方法

滚动和,句号来自Pandas列

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

Pandas - groupby字符串字段并按时间范围 Select

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

DataFrames与NaN的条件乘法

如何合并两个列表,并获得每个索引值最高的列表名称?

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

以逻辑方式获取自己的pyproject.toml依赖项

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

如何创建引用列表并分配值的Systemrame列

干燥化与列姆化的比较

BeautifulSoup:超过24个字符(从a到z)的迭代失败:降低了首次深入了解数据集的复杂性:

Django Table—如果项目是唯一的,则单行

一个telegram 机器人应该发送一个测验如何做?""

提取数组每行的非零元素

在第一次调用时使用不同行为的re. sub的最佳方式

有没有一种方法可以在朗肯代理中集成向量嵌入

正在try 让Python读取特定的CSV文件

FileNotFoundError:[WinError 2]系统找不到指定的文件:在os.listdir中查找扩展名