【问题标题】:Using count() in python [closed]在 python 中使用 count() [关闭]
【发布时间】:2017-03-20 20:41:37
【问题描述】:

我必须澄清我的问题,因为有些人认为这是一个不明确的问题。问题是,我有一个包含四种不同类型数据的列表。为了澄清我的想法,这里有一小部分。

   UserID     movie_id  rating    unix_timestamp
    196        242         3       881250949
    186        302         3       891717742
    22         377         1       878887116
    244        51          2       880606923
    166        346         1       886397596
    298        474         4       884182806
    115        265         2       881171488
    253        465         5       891628467
    305        451         3       886324817
     7         451         5       891353892

有些 monvies,他们从用户那里得到的评分总和是 50 、 44 或 88 等。 例如,movie_id (451) 得到了 3 和 5 的评分(所以它一起得到了 8 个评分)。我想排除那些评分低于 50 的电影。并获得评分超过 50 的其他电影的平均值(他们从用户那里获得的评分总和),并仅显示前 5 或 10 个值。

这是代码的一部分

grouped_data = ratings['rating'].groupby(ratings['movie_id'])
## average and combine
average_ratings = grouped_data.mean()
print ("Average ratings:")
print (average_ratings.head())

【问题讨论】:

标签: python pandas


【解决方案1】:

在熊猫中经常给猫剥皮的方法有很多,这里有几种方法:

1.对groupby应用几个函数

对 groupby 应用均值和计数:

In [1]: df= ratings['rating'].groupby(ratings['movie_id']).agg(['mean', 'count'])
        df.head(3)
Out[1]: 
           mean     count
movie_id        
1          3.878319     452
2          3.206107     131
3          3.033333     90

然后就可以过滤,返回最大的5个:

In [2]: df.ix[(df['count'] >= 50), 'mean'].nlargest(5)

Out[2]:
movie_id
408    4.491071
318    4.466443
169    4.466102
483    4.456790
114    4.447761
Name: mean, dtype: float64

2.事后使用布尔索引

这假设您已经执行了问题的全部代码,因此average_ratings 已经存在

movie_count = ratings.movie_id.value_counts()
higher_than_50_votes = movie_count.index[movie_count > 50]
# Apply that to your average_ratings, sort, and return
average_ratings.ix[higher_than_50_votes].sort_values(ascending=False).head(5)

3.使用 groupby.filter

ratings.groupby('movie_id').filter(lambda x: len(x) > 50).groupby('movie_id')['rating'].mean().sort_values(ascending=False).head(5)

【讨论】:

  • 使用 nlargest 比排序和 head 效率高得多(也可以直接在 groupby 上执行此操作)
  • 哈!尽管我已经使用 pandas 多年了,但我完全错过了这个 :) 你每天都能学到一些东西,谢谢!
  • 如果我想使用(Julien Marrec 先生的解决方案)但排除一些用户的评分,用户 id 是指具有不同名称的用户,因此可以从计数中排除一些名称。跨度>
  • 在 groupby 之前过滤掉评级。排除 3 个用户的示例。 exclude_users = [405, 655, 69]。然后,您可以选择不是来自这些用户的评分。 (~ 表示 NOT)ratings[~ratings.user_id.isin(exclude_users)] 阅读indexing 上的文档,尤其是“使用 isin 进行索引”
猜你喜欢
  • 2012-08-20
  • 2013-06-11
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 2020-05-16
  • 2013-03-21
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多