我有一个包含许多列的Pandas数据框,其中两个是"电影标题"和#34;年龄",我想找到排名最低的前五部电影,但只包括至少有100个评级的电影(因此至少有100行)。
例如:
movie title age
Title 1 10
Title 2 12
Title 2 12
Title 3 13
Title 3 13
Title 3 13
应该成为:
movie title # of ratings avg age
Title 1 1 10
Title 2 2 12
Title 3 3 13
它可以位于相同或新的数据框中。谢谢你的帮助!
答案 0 :(得分:4)
说你做
agg = df.age.groupby([df['movie title']]).agg({'ave_age': 'mean', 'size': 'size'})
您将获得包含ave_age
和size
列的DataFrame。
agg[agg['size'] > 100]
只会为您提供超过100个用户。从那里开始,按agg.ave_age
排序,然后排在前5位。它应该是这样的:
agg[agg['size'] > 100].sort_values(by='ave_age', ascending=True).head(5)
答案 1 :(得分:3)
过滤器为每部电影创建一个标志,如果电影标题数量超过一百,则设置为True,否则为False。
n = 100
filter = (df.groupby(['movie title'])['age']
.transform(lambda group: group.count()) >= n)
鉴于您的示例数据规模较小,我会将n
设置为2并创建我的过滤器。
现在我只过滤计数超过n
的电影,计算每组的平均年龄,然后选择最小的五个(即最低年龄)。
>>> df[filter.values].groupby('movie title').age.mean().nsmallest(5)
movie title
Title 2 12
Title 3 13
Name: age, dtype: int64