理解groupby和pandas
我正在尝试使用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功能上?任何建议或提示都非常有帮助!
1 个回答
正如DanB所说,groupby()这个功能就是把你的数据表(DataFrame)分成几个组。然后,你可以对每个组应用一些函数,pandas会尽量把结果合并在一起,并用原来的组标识来索引。除此之外,按照我的理解,pandas并不会记住原来每个组的样子。
所以,你需要明确你想要输出的内容。实现这个目标有几种方法——我建议你了解一下'agg'和'apply'。'Agg'是用来处理那些对整个组返回单个值的函数,而'apply'则灵活得多。
如果你能具体说明你想做什么,我可以提供更有帮助的建议。现在,我先给你两个例子。
- 假设你想要每个评论者的评论数量,以及第一次和最后一次评论的日期,还有第一次和最后一次评论的电影。因为这些都是每个组的单个值,所以可以使用'agg':
grouped_reviews = reviews.groupby('critic')
grouped.agg('size', {'date': ['first', 'last'], 'title': ['first', 'last']})
- 假设你想返回每个评论者的第一次和最后一次评论的数据表。我们可以使用'apply',它可以与任何输出pandas对象的函数一起使用。所以我们会写一个函数,处理每个组,并返回只包含第一行和最后一行的数据表:
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)
如果你能更具体地说明你想做什么,我可以给你更详细的答案。