【问题标题】:Find the frequency of words in a dataframe from a list从列表中查找数据框中单词的频率
【发布时间】:2020-08-26 13:57:09
【问题描述】:
import pandas as pd
list = ['apple','banana','cherries','dragonfruit','elderberry']
data = {'name': ['Alpha', 'Bravo','Charlie','Delta','Echo'],
             'favorite_fruit':  ['apple banana cherries', 'banana cherries dragonfruit',
                           'cherries dragonfruit','dragonfruit','apple elderberry']}

df = pd.DataFrame (data, columns = ['name','favorite_fruit'])

我想计算df中list中每个水果的频率。 预期输出:

df2
Fruit       | Frequency
Apple       |    2     
Banana      |    2
Cherries    |    3
Dragonfruit |    3
Elderberry  |    1

代码 df.favorite_fruit.str.split(expand=True).stack().value_counts() 适用于小型 DataFrame。 如果df.favorite_fruit包含数千行不同的水果组合, 如何仅找到list 中单词的频率?

【问题讨论】:

    标签: python python-3.x regex pandas


    【解决方案1】:

    也许这是一个漏洞答案,但您可以从您已经描述的答案中过滤掉值。所以如果你从这个开始:

    >>> df2 = df.favorite_fruit.str.split(expand=True).stack()
    >>> df2
    
    0  0          apple
       1         banana
       2       cherries
    1  0         banana
       1       cherries
       2    dragonfruit
    2  0       cherries
       1    dragonfruit
    3  0    dragonfruit
    4  0          apple
       1     elderberry
    dtype: object
    

    您可以使用isin 将数据限制为目标列表中的数据:

    >>> target = ['apple', 'banana']
    >>> df2[df2.isin(target)].value_counts()
    
    banana    2
    apple     2
    dtype: int64
    

    甚至在你原来的答案之后:

    >>> df.favorite_fruit.str.split(expand=True).stack().value_counts().loc[target]
    
    apple     2
    banana    2
    dtype: int64
    

    如果问题是 expandstack 操作对于这么多数据的成本很高,那么这可能不会令人满意。但我认为这可能比基于循环的答案更好?

    【讨论】:

    • 使用漏洞答案的第一部分有效,但第二部分,代码 df.favorite_fruit.str.split(expand=True).stack().value_counts().loc[target] 返回 KeyError: 'Passing list-likes to .loc or [] with any missing labels is no支持时间更长,请参阅pandas.pydata.org/pandas-docs/stable/user_guide/…'。我将 .loc 更改为 .reindex 但它不起作用。代码的第二部分,如果工作会更好,因为它不会添加更多变量..
    • @Luc hmmmm 这对我有用 - 我在您的示例中的 df = pd.DataFrame.... 行之后复制/粘贴该行,我没有收到错误(也定义了 target = ['apple', 'banana'])。 value_counts() 返回的 Series 应该将水果值作为索引,因此您应该能够使用 loc 和水果名称来索引
    • 可能是因为我的真实数据中缺少标签。不过,如果第二种解决方案不起作用。第一个就可以了,虽然我会创建很多变量。谢谢!
    • @Luc ahhh 这是在您的真实数据中 - 该错误应该意味着您的目标词之一不在 DataFrame 中/值计数 - 这可能吗?但在这种情况下,df.favorite_fruit.str.split(expand=True).stack().value_counts().reindex(target) 也适用于我。
    【解决方案2】:

    也许这样做有点迂回,但如果你的favorite_fruit 列总是用空格分隔,这样的事情应该可以工作:

    import pandas as pd
    
    list = ['apple','banana','cherries','dragonfruit','elderberry']
    data = {'name': ['Alpha', 'Bravo','Charlie','Delta','Echo'],
                 'favorite_fruit':  ['apple banana cherries', 'banana cherries dragonfruit',
                               'cherries dragonfruit','dragonfruit','apple elderberry']}
    
    df = pd.DataFrame (data, columns = ['name','favorite_fruit'])
    
    new_df = pd.DataFrame()
    data = {}
    
    for i, row in df.iterrows():
        s = row['favorite_fruit']
        items = s.split(' ')
        for item in items:
            if item in data.keys():
                data[item].append(1)
            else:
                data[item] = [1]
    
    for key, value in data.items():
        data[key] = sum(value)
    
    fruit = []
    frequency = []
    
    for key, value in data.items():
        fruit.append(key)
        frequency.append(value)
    
    new_df = pd.DataFrame({'fruit': fruit, 'frequency':frequency})
    print(new_df)
    

    这会打印出以下内容:

             fruit  frequency
    0        apple          2
    1       banana          2
    2     cherries          3
    3  dragonfruit          3
    4   elderberry          1
    

    【讨论】:

    • 对不起,它很接近,但不能完全解决我的“真正”问题。 favorite_fruit 是一个包含句子的字符串,有时包含逗号和表情符号。上面的代码给出了favorite_fruit 列中所有单词的频率,而不仅仅是list 中单词的频率。
    • 那么您需要更新和编辑您的最小工作示例以反映这一点...否则我们无法帮助您...
    【解决方案3】:

    拆分后尝试使用explode功能。

    df.favorite_fruit.str.split().explode().value_counts()
    
    cherries       3
    dragonfruit    3
    banana         2
    apple          2
    elderberry     1
    Name: favorite_fruit, dtype: int64
    

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 2020-12-29
      • 2021-01-16
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 2021-01-21
      相关资源
      最近更新 更多