我正在尝试在电影数据集中使用pandas来查找评论最多的10位评论家,并在表格中列出他们的名字,其中包含他们所使用的杂志出版物的名称以及他们的第一个和最后一个的日期审查。
电影数据集作为csv文件启动,在excel中看起来像这样:
critic fresh date publication title reviewtext
r.ebert fresh 1/2/12 Movie Mag Toy Story 'blahblah'
n.bob rotten 4/2/13 Time Ghostbusters 'blahblah'
r.ebert rotten 3/31/09 Movie Mag CasaBlanca 'blahblah'
(你可以假设评论家只在一本杂志/出版物上发表评论)
然后我的基本代码就像这样开始:
reviews = pd.read_csv('reviews.csv')
reviews = reviews[~reviews.quote.isnull()]
reviews = reviews[reviews.fresh != 'none']
reviews = reviews[reviews.quote.str.len() > 0]
most_rated = reviews.groupby('critic').size().order(ascending=False)[:30]
print most_rated
output>>>
critic
r.ebert 2
n.bob 1
然后我知道如何隔离十大评论家和他们所做的评论数量(如上所示),但我仍然不熟悉pandas groupby,使用它似乎摆脱了其余的列(以及发布和日期之类的东西)。当该代码运行时,它只打印一个电影评论家列表和他们完成了多少评论,而不是任何其他列数据。
老实说,我已经迷失了如何做到这一点。我是否需要将原始评论中的数据附加到我的排序数据框中?我是否需要将函数应用于groupby函数?提示或建议将非常有帮助!
答案 0 :(得分:0)
正如DanB所说,groupby()只是将你的DataFrame拆分成组。然后,您将一些函数应用于每个组,并且pandas将尽可能地将结果拼接在一起 - 由原始组标识符索引。除此之外,据我所知,原始群体看起来没有“记忆”。
相反,您必须指定要包含的输出内容。有几种方法可以做到这一点 - 我会研究'agg'和'apply'。 'Agg'用于为整个组返回单个值的函数,而apply更灵活。
如果您指定要执行的操作,我会更有帮助。现在,我只想举两个例子。
grouped_reviews = reviews.groupby('critic')
grouped.agg('size', {'date': ['first', 'last'], 'title': ['first', 'last']})
def get_first_and_last(df):
return pd.concat((df.iloc[0], df.iloc[-1]), axis = 1,ignore_index = True)
grouped_reviews.apply(get_first_and_last)
如果您更具体地了解您的目标,我可以给您一个更具体的答案。