我有Yelp数据集,我想要计算所有超过3星的评论。通过这样做,我得到了评论的数量:
reviews.groupby('business_id')['stars'].count()
现在我想得到超过3星的评论数,所以我尝试从here获取灵感:
reviews.groupby('business_id')['stars'].agg({'greater':lambda val: (val > 3).count()})
但这只是给了我以前所有明星的数量。我不确定这是否是正确的方法?我在这里做错了什么。 lambda表达式是不是通过星列的每个值?
编辑: 好吧,我觉得很蠢。我应该使用sum函数而不是count来获取大于3的元素的值,如下所示:
reviews.groupby('business_id')['stars'].agg({'greater':lambda val: (val > 3).sum()})
答案 0 :(得分:9)
您可以尝试:
reviews[reviews['stars'] > 3].groupby('business_id')['stars'].count()
答案 1 :(得分:1)
由于我还想重命名该列并在同一列上运行多个功能,所以我提出了以下解决方案:
# Counting both over and under
reviews.groupby('business_id')\
.agg(over=pandas.NamedAgg(column='stars', aggfunc=lambda x: (x > 3).sum()),
under=pandas.NamedAgg(column='stars', aggfunc=lambda x: (x < 3).sum()))\
.reset_index()
pandas.NamedAgg 允许您创建多个新列,因为该功能已在从未使用过的熊猫版本中删除。
答案 2 :(得分:0)
有点晚了,但是我的解决方法是:
reviews.groupby('business_id').stars.apply(lambda x: len(x[x>3]) )
我遇到了这个线程,以寻找“给定GroupBy中X之上的值的分数是多少”。 如果有人感兴趣,这是解决方案:
reviews.groupby('business_id').stars.apply(lambda x: len(x[x>3])/len(x) )
答案 3 :(得分:0)
我很喜欢使用method chaining with Pandas,因为它更易于阅读。我没有尝试过,但我认为这也应该起作用
reviews.query("stars > 3").groupby("business_id").size()