我的df
看起来像这样:
category text
-------- ----
soccer soccer game is good
soccer soccer game
basketball game basketball
basketball game
volleyball sport volleyball sport
我想要做的是groupby
category
,然后按频率
列出单词
category text frequency
-------- ---- ---------
soccer soccer 2
game 2
is 1
good 1
basketball game 2
basketball 1
volleyball sport 2
volleyball 1
我做了什么?
- 我将所有
文本
组合在一起
df.groupby(['类别])['文本'].sum()
现在,自从我将其分组以来,所有文本都位于相同的行
上,但我不知道如何使用每个字数来制作频率表。
有人可以帮我吗?
最佳答案
#方法1:
您可以将series.str.split
与explode
和groupby.value_counts
结合使用
(df.assign(text=df['text'].str.split()).explode("text")
.groupby("category",sort=False)['text'].value_counts())
category text
soccer game 2
soccer 2
good 1
is 1
basketball game 2
basketball 1
volleyball sport 2
volleyball 1
Name: text, dtype: int64
#方法2:
对于旧版本的 pandas,使用 np.concatenate
和 index.repeat
以及 df.join
(还列出了其他方法 here )
s = df['text'].str.split()
(df[['category']].join(pd.Series(np.concatenate(s),
index=df.index.repeat(s.str.len()),name='text'))
.groupby("category",sort=False)['text'].value_counts())
#方法 3:使用 sklearn
中的 MultiLabelBinarizer
from sklearn.preprocessing import MultiLabelBinarizer
s = df['text'].str.split()
mlb = MultiLabelBinarizer()
mlb.fit(s)
out = pd.DataFrame(mlb.transform(s),columns=mlb.classes_).groupby(df['category']).sum()
out.replace(0,np.nan).stack().astype(int)
category
basketball basketball 1
game 2
soccer game 2
good 1
is 1
soccer 2
volleyball sport 1
volleyball 1
dtype: int32
关于python - 如何使用 Pandas 按类别分组然后计算单词的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65601043/