基于其他列中数据的列表中单词的频率

2024-04-29 02:05:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下所示的数据帧

Utterance                         Frequency   
Directions to Starbucks           1045
Show me directions to Starbucks   754
Give me directions to Starbucks   612
Navigate me to Starbucks          498
Display navigation to Starbucks   376
Direct me to Starbucks            201
Navigate to Starbucks             180

这里,有一些数据显示了人们的话语,以及这些话语的频率。你知道吗

例如,“星巴克方向”被说了1045次,“给我看星巴克方向”被说了754次,等等

我想知道每个单词被说出多少次的频率。你知道吗

我试着使用.value_counts(),但那只给了我以下的结果

Utterance       Frequency   
Starbucks       7
Directions      3
Navigate        2
.
.
.

相反,我试图得到以下输出

Utterance       Frequency   
Starbucks       3666
Directions      2411
Navigate        678
.
.
.

换言之,我只是想知道他们被说了多少次,而不是他们出现了多少行,这才是最令人高兴的值。计数()

谢谢你的帮助!你知道吗


Tags: to数据showdisplay方向频率mefrequency
3条回答

我认为需要:

df = (df.set_index('Frequency')['Utterance']
        .str.split(expand=True)
        .stack()
        .groupby(level=0)
        .value_counts()
        .reset_index(name='new')
        .assign(Frequency = lambda x: x.Frequency * x['new'])
        .groupby('level_1', as_index=False)['Frequency'].sum()
        .rename(columns={'level_1':'Words'})
        )
print (df)
         Words  Frequency
0       Direct        201
1   Directions       1045
2      Display        376
3         Give        612
4     Navigate        678
5         Show        754
6    Starbucks       3666
7   directions       1366
8           me       2065
9   navigation        376
10          to       3666

如果每行仅包含唯一的单词,则解决方案是简化:

df = (df.set_index('Frequency')['Utterance']
        .str.split(expand=True)
        .stack()
        .reset_index(name='Words')
        .groupby('Words', as_index=False)['Frequency'].sum()
        )
print (df)
         Words  Frequency
0       Direct        201
1   Directions       1045
2      Display        376
3         Give        612
4     Navigate        678
5         Show        754
6    Starbucks       3666
7   directions       1366
8           me       2065
9   navigation        376
10          to       3666

解释:

  1. 从列Frequency创建索引
  2. ^{}句到词到DataFrame
  3. ^{}重塑形状
  4. ^{}获取每个组的计数
  5. 具有Frequency^{}的多重计数列
  6. ^{}按单词聚合sum

对于O(n)复杂性解决方案,使用collections.Counter。你知道吗

from collections import Counter
import pandas as pd

df = pd.DataFrame([['Directions to Starbucks', 1045],
                   ['Show me directions to Starbucks', 754],
                   ['Give me directions to Starbucks', 612],
                   ['Navigate me to Starbucks', 498],
                   ['Display navigation to Starbucks', 376],
                   ['Direct me to Starbucks', 201],
                   ['Navigate to Starbucks', 180]],
                  columns = ['Utterance', 'Frequency'])

c = Counter()

for row in df.itertuples():
    for i in row[1].split():
        c[i] += row[2]

res = pd.DataFrame.from_dict(c, orient='index')\
        .rename(columns={0: 'Count'})\
        .sort_values('Count', ascending=False)

结果

            Count
to           3666
Starbucks    3666
me           2065
directions   1366
Directions   1045
Show          754
Navigate      678
Give          612
Display       376
navigation    376
Direct        201

解释

  • 循环浏览每一行和每一行中的每一个单词。你知道吗
  • 对于每个单词,使用单词作为键递增计数器。你知道吗
  • 从结果字典创建数据帧。你知道吗

这应该可以做到:

output = {}
for i in ['starbucks','directions','navigate']:
    output[i] = df[df['Utterance'].str.lower().str.contains(i)]['Frequency'].sum()

收益率:

{'starbucks': 3666, 'directions': 2411, 'navigate': 678}

相关问题 更多 >