木子卜—木子卜资源网

学习Python数据分析第五天——分组,排序,聚合

分组,排序,聚合

排序,分组和聚合的组合都有无数种,这在技术层面不难。但如果要写报告,避免大而全,因为客户的注意力很容易浪费在没有意义的图表上。将客户真正关心的搞出来,行业背景分析,用户画像,竞品监测,销售行为分析...如果是写通俗文章,多问几个人,你想要知道什么。

1 分组

分组就是按照一个或多个键,将数据分为几个组的过程。你可以直接传列名做分组,df.groupby('column_name')

也可以传递相同行数的Series甚至DataFrame。下面的例子是按日期里的年做分组:

df2.groupby(df2.日期.map(lambda x:x.year))

Pandas也能支持传递多个列的数组,除了切片以外,能在索引上使用的基本都能在group,sort上使用,一致性的API上手非常容易。

值得注意的是,由于时间索引分组比较困难,例如每五个月一组,可以用针对TimeStamp特定优化的方案,如resample:

例子北京按年平均的AQI:

db[db.city==u'北京'][u'平均值'].resample('12M').aqi.mean()

2 排序

Pandas的排序非常之快,大部分操作都能在瞬间完成。排序分为两类:

对一般数据排序
一般排序,直接用sort即可,传递lambda,列名或多个列,或长度一致的Series,这与groupby等其他API一致,此处从略。

可指定ascending=True|False来指定升序,降序。

对分组后数据排序
groupby之后的数据,和一般的DataFrame不同,而像个字典(dict)。对键排序,需使用sort_index,值排序,需使用sort_values。

3 聚合

聚合可将分组后的数据按需求重新打平。如求每个分组的最大值(max),最小值(min),或数量等,例如:

df2.groupby(df2.日期.map(lambda x:x.year)).size()

例子

car.groupby(car.年月.map(lambda x:x.month)).销量.sum().plot(kind='bar',title='汽车市场月度销量汇总')

将汽车数据按照月份分组,按销量求和。然后绘制直方图:

Pandas支持直接将聚合结果绘图输出(虽然丑但是方便啊),下一节我们将详细介绍它的使用细节。

这条语句统计了广西省东风MPV的各车型总体销量情况,并按数量降序:

df[(df.省=='广西') & (df.车型分类=='MPV') & (df.品牌=='东风')].groupby('车型').size().sort_values(ascending=False)

4 数据透视表

如果我想一次性地针对多种分组方式实行多种聚合策略,有没有更方便的API? 答案是数据透视表(pivot_table)。Excel也有该功能,异常强大,有了它,一般需求几乎都能实现。

下面是同时按Name rep manager分组,按价格分别以总价和数量聚合,并将空值填为0.

pd.pivot_table(df,index=["Name","Rep","Manager"],values=["Price"],aggfunc=[np.sum,len],fill_value=0)
pivot_table的基本操作

pivot之后,生成的DataFrame是multiindex的,处理起来稍显繁琐,用xs可将某个子index的数据“提升”出来,例如:

df_pivot.xs(('12AM新坐标',2011))

至于更复杂的访问和采样,可配合loc和PD.IndexSlice, 可自行查看官方文档。

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »