【问题标题】:frequency of words in a list based on data in other columns基于其他列数据的列表中单词的频率
【发布时间】:2018-09-04 18:17:12
【问题描述】:

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

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
.
.
.

换句话说,我试图获取它们被说出多少次的频率,而不是它们出现的行数,这就是 value.counts() 所发生的事情

感谢您的帮助!

【问题讨论】:

    标签: python pandas statistics


    【解决方案1】:

    对于 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
    

    说明

    • 遍历每一行和每一行中的每个单词。
    • 对于每个单词,递增计数器,使用单词作为键。
    • 根据结果字典创建数据框。

    【讨论】:

    • 后续问题(也发布在下面),有没有办法加入某些词,例如“给予、展示、导航、直接和我”?在这个过程中?例如,如果我想组合短语动词,那么我可以得到类似的输出... phrasal_verbs (direct, give, show, nagivate) = 2065
    • 我会在这些词和一个组元组之间创建一个映射,然后执行相同的过程。对于完整的解决方案,我建议您作为一个单独的问题提出。
    • 发到这里了,可以的话请看一下:stackoverflow.com/questions/49496102/…
    【解决方案2】:

    我认为需要:

    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. split 句子到单词到DataFrame
    3. stack重塑
    4. 通过SeriesGroupBy.value_counts 获取每组的计数
    5. Frequency by assign 的多个计数列
    6. 聚合sumGroupBy.sum

    【讨论】:

    • 谢谢!我刚试过,我仍然得到相同的原始输出:(
    • 后续问题,有没有办法加入某些词,比如“give, show, nagivate, direct, and me”?在这个过程中?例如,如果我想组合短语动词,那么我可以得到类似的输出... phrasal_verbs (direct, give, show, nagivate) = 2065
    • 发到这里了,可以的话请看一下:stackoverflow.com/questions/49496102/…
    【解决方案3】:

    这应该可以解决问题:

    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}
    

    【讨论】:

    • 谢谢!那只会输出: 3666 2411 678 有没有办法像上面的数据框或我可以看到 {'starbucks': 3666} 的字典一样返回?谢谢!
    • 当然,编辑输出结果字典。
    猜你喜欢
    • 2023-03-31
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多