美文网首页我爱编程
Pandas学习随笔(2) Group的学习

Pandas学习随笔(2) Group的学习

作者: 栽生物坑里的信息汪 | 来源:发表于2018-05-07 14:17 被阅读0次

    前言

    除开了10min入门的教程后,大概进入了高级一点的用法,这里不会按照官方教程的顺序去学习,会按照自己的想法去跳跃性的学习,有需求者选择性的阅读吧。

    正文

    以下是太长不看系列
    主要内容:Group by

    1. groupby是个object,用groupby.get_groups可获得对应df的切片
    2. groupby可接受mapping dict, function, 列/行名等多种分组方式
    3. 主要操作包括:Aggregation、Transformation、Filtration
    4. groupby.apply(),传入参数为各组的subset矩阵,即get_groups得到的子集矩阵。

    1. Spliting

    import pandas as pd
    d = {'one':[1,1,1,1,1],
         'two':[2,2,2,2,2],
         'letter':['a','a','b','b','c']}
    df = pd.DataFrame(d)
    one = df.groupby('letter') # 按某列的值进行分组 默认是axis=0
    one2 = df.groupby(['letter','one']) # 按多列的tuple对象进行分组
    
    tmp = df.loc[:,'letter']
    series_group_by = tmp .groupby(lambda x: tmp[x]) # 按值进行分组
    series_ = tmp.groupby(level=0) # 按index进行分组
    

    以上涉及到了有且仅有的两种group,分别是DataFrame.groupbySeries.groupby,两者的function大体上是一样的,但是还是有一部分的区别。而且由于Series不具有列名了,所以groupby时一般使用mapping dict或者Function去进行分组,而且接受的参数是对应的index而不是Values本身

    Difference between these

    由于group后的对象是没有定义__repr__的,所以其实是看不到内部结构的,但是也有少数的接口进行access内部的结果。

    # 与上代码同个terminal
    one.groups # 对应的分组,返回dict
    one.indices # 对应的分组内的index,返回dict,与上行相似
    one.get_groups # 划重点,可以直接获取该组的DataFrame的切片
    

    2. Applying

    # 与上代码同个terminal
    one.apply(lambda x: x.loc[:,'one']/x.sum(0)['one']) 
    one.agg([min,max,lambda x: ';'.join([str(_) for _ in list(x)])])   # 等同于one.agg()
    one.pipe() # 接收的是 接收groupby的对象的Function
    one.transform() # 返回一个无分组信息后的原矩阵,当然可以加入一些修改,类似于apply
    
    1. apply的用法比较tricky,每次传入的x是个DataFrame,也就是get_groups后取得的东西,所以需要注意如何使用和调用。以上相当于在求解每个one列在各组内的均值。也是十分常用的一个操作。
    2. 秀了一下骚操作,agg同上述的apply,但是返回的对象就不太一样了,上者返回的是同等于原矩阵的df,而agg返回的是以组别为index,原列名+这里使用Function作为Multindex的特殊df。同样地,非常适合快速处理组内的矩阵subset。
    3. 是为了简略f(g(h(df.groupby('group')), arg1=a), arg2=b, arg3=c),这个可以使用pipe进行管道化
    4. 类似于apply,但是传入的是按组按列subset的子集,apply传入的仅仅是按组subset的子集。

    剩下有许多的类似于GroupBy.count的这些,但是几乎都是基于apply、agg的扩展,所以我不打算继续赘述,但下列会列举一些独特的、有意思的实现。

    one.count() # 很简单,但是自己写代码难以同等速度的实现,返回的是每个组,每列中除了NaN的计数
    one.cumcount() # 返回的东西很奇怪,但其实是每个组组内的计数,从0->组内总数-1
    one.ngroup() # 类似上者,但是统计的是多少个组。 (可用来看组在整体中分布/增长速度)
    one.nth() #截取某几行,可用int也可用list (apply很难实现,会变成MultiIndex)
    
    

    剩下的都是sum mean median std max min size ohlc等基础的功能了,而且很多DataFrame的功能它一样可以使用,例如all any describe hist quantile rank等等。

    3. combining

    其实说是要combining,但其实每个apply后,都会返回一个combin后的对象,所以不需要操心。
    重点是要了解到apply所传入的参数是啥,以及多思考能够怎么使用,而且需要注意的是,由于DataFrame是一个类似于dict的一个高级数据结构,所以其实很多操作在DF内部使用会比取出然后再自己操作快很多。

    下一章写什么好呢。。。碎碎念

    Reference

    1. GroupBy function
    2. GroupBy object relative function

    相关文章

      网友评论

        本文标题:Pandas学习随笔(2) Group的学习

        本文链接:https://www.haomeiwen.com/subject/cpjcrftx.html