加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

pandas基础:groupby&transform(lambda)

(2018-03-28 10:00:00)
分类: python
pandas 里面groupby经常与transform连用,除了常用的sum,mean,std外如果需要自定义计算的时候就需要用到transform,看看官网对transform和apply的区别解释
We will be using the attribute transform instead of apply. The reason is that transform will keep the shape(# of rows and columns) of the dataframe the same and apply will not. 
transform这个函数比apply更常用就是由于它按df的形状(行和列)计算,apply不行,由于transform根据df的形状计算,所以和lambda结合节省不少代码,下面看一些例子
这个df数组如果df.groupby('state')的话就会出现上面三行汇总的结果,有时候这些汇总不一定是我们想要的,更多的情况我们需要在df里面新增一些columns来放计算后的数据,例如我现在需要增加两列['rev_sum','cost_sum'],然后按state进行归类后把相应的sum放进去,这时候我们需要很简单的一行代码就行:newdf[['rev_sum','cost_sum']]=state.transform(lambda x:x.sum()) ,这里面的state是对df进行groupby,输出结果:
这样新增的两列就是对revenue和cost的计算,这个计算是基于对state的groupby,相当于把上面的汇总放进来,当然实际开发这里对应的就是自定义的公式了

另外还有很有用的功能就是groupby里面用lambda进行时间汇总,例如month=df.groupby(['state',lambda x:x.month],as_index=True),这里意思就是按state进行groupby,加上月份,可以是day,或year,基于df的index情况进行各种时间归类,这就是相当于一个两层的归类,先按state然后按月份,看看输出
比如说第三行ny的rev_sum为什么是2,因为1月份的ny只有这一行,所以就是2,那2013-12-01为什么是14呢?因为ny在12月份有两行,得加上上面第二行的1,所以是14,其他同理,由于本例的groupby分别按state和month,所以同样是5月份由于不同state也不会归在一起

代码也很简单,定义了month后df[['rev_sum','cost_sum']]=month.transform(lambda x:x.sum()) 一句就搞定,当然也可以自定义一个函数,例如:
def myfunc(group):
    group['rev_sum']=group['revenue'].sum()
    group['rev_cost']=group['cost'].sum()
    return group
month.apply(myfunc)
它们的效果一模一样
看源码
最后补一个官网transform的例子

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有