【问题标题】:Count sub word frequency in pandas DataFrame计算 pandas DataFrame 中的子词频
【发布时间】:2017-05-28 21:27:16
【问题描述】:

我有一个 pandas.DataFrame 有 2 列,其中包含酒精的类型(即 VODKA 80 PROOF、加拿大威士忌、五香朗姆酒)和售出的瓶数。我想首先将其分类为粒度较小的类别,即(威士忌、伏特加、朗姆酒),然后将每个类别销售的所有瓶子相加。

我的代码不允许我隔离“VODKA”等标签,而是返回“VODKA 80 Proof”等类别的频率。

在:

top_N = 10 # top 10 most used categories

word_dist = nltk.FreqDist(df['Category Name'])

print('All frequencies:')
print('=' * 60)
rslt = pd.DataFrame(word_dist.most_common(top_N),
                    columns=['Word', 'Frequency'])
print(rslt)
print('=' * 60)

df= df.groupby('Category Name')['Bottles Sold'].sum()

输出:

All frequencies:
============================================================
                               Word  Frequency
0                    VODKA 80 PROOF      35373
1                 CANADIAN WHISKIES      27087
2         STRAIGHT BOURBON WHISKIES      15342
3                        SPICED RUM      14631
4                    VODKA FLAVORED      14001
5                           TEQUILA      12109
6                  BLENDED WHISKIES      11547
7                   WHISKEY LIQUEUR      10902
8                    IMPORTED VODKA      10668
9  PUERTO RICO & VIRGIN ISLANDS RUM      10062
============================================================

有什么想法吗?

【问题讨论】:

    标签: python pandas count frequency


    【解决方案1】:

    您是否考虑过添加匹配词的类别?比如:

    代码:

    categories = {'VODKA', 'WHISKIES', 'RUM', 'TEQUILA', 'LIQUEUR'}
    df['category'] = df['product'].apply(lambda x:
                                         [c for c in categories if c in x]
    

    测试代码:

    data = [
        ['VODKA 80 PROOF', '35373'],
        ['CANADIAN WHISKIES', '27087'],
        ['STRAIGHT BOURBON WHISKIES', '15342'],
        ['SPICED RUM', '14631'],
        ['VODKA FLAVORED', '14001'],
        ['TEQUILA', '12109'],
        ['BLENDED WHISKIES', '11547'],
        ['WHISKEY LIQUEUR', '10902'],
        ['IMPORTED VODKA', '10668'],
        ['PUERTO RICO & VIRGIN ISLANDS RUM', '10062'],
    ]
    df = pd.DataFrame(data, columns=['product', 'count'], dtype=int)
    
    categories = {'VODKA', 'WHISKIES', 'RUM', 'TEQUILA', 'LIQUEUR'}
    df['category'] = df['product'].apply(lambda x:
                                         [c for c in categories if c in x][0])
    print(df)
    print(df.groupby('category')['count'].sum())
    

    结果:

                                product  count  category
    0                    VODKA 80 PROOF  35373     VODKA
    1                 CANADIAN WHISKIES  27087  WHISKIES
    2         STRAIGHT BOURBON WHISKIES  15342  WHISKIES
    3                        SPICED RUM  14631       RUM
    4                    VODKA FLAVORED  14001     VODKA
    5                           TEQUILA  12109   TEQUILA
    6                  BLENDED WHISKIES  11547  WHISKIES
    7                   WHISKEY LIQUEUR  10902   LIQUEUR
    8                    IMPORTED VODKA  10668     VODKA
    9  PUERTO RICO & VIRGIN ISLANDS RUM  10062       RUM
    
    category
    LIQUEUR     10902
    RUM         24693
    TEQUILA     12109
    VODKA       60042
    WHISKIES    53976
    Name: count, dtype: int32
    

    【讨论】:

      【解决方案2】:

      感谢斯蒂芬您的意见!

      我做了一点修改,因为你的回答是给我一个 KeyError。 这是我的修改:

      def search_brand(x):
          x = str(x)
          list_brand = ['VODKA','WHISKIES', 'RUM', 'TEQUILA', 'LIQUEUR', 'BRANDIES', 'COCKTAILS']
          for word in list_brand:
              if word in x:
                  return word
      
      
      df['Broad Category'] = df['Category Name'].apply(search_brand)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 2017-12-15
        • 2021-08-05
        • 2016-06-30
        • 2021-02-28
        • 2011-02-22
        相关资源
        最近更新 更多