zoukankan      html  css  js  c++  java
  • Pandas之groupby( )用法笔记

    groupby官方解释

    DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

    Group series using mapper (dict or key function, apply given function to group, return result as series) or by a series of columns.

    讲真的,非常不能理解pandas官方文档的这种表达形式,让人真的有点摸不着头脑,example给得又少,参数也不给得很清楚,不过没有办法,还是只能选择原谅他。

    groupby我用过的用法

    基本用法我这里就不呈现了,我觉得用过一次的人基本不会忘记,这里我主要写一下我用过的关系groupby函数的疑惑:

    apply & agg

    这个问题着实困扰了我很久,经过研究,找了一些可能帮助理解的东西。先举一个例子:

    import pandas as pd
    df = pd.DataFrame({'Q':['LI','ZHANG','ZHANG','LI','WANG'], 'A' : [1,1,1,2,2], 'B' : [1,-1,0,1,2], 'C' : [3,4,5,6,7]})
     ABCQ
    0 1 1 3 LI
    1 1 -1 4 ZHANG
    2 1 0 5 ZHANG
    3 2 1 6 LI
    4 2 2 7 WANG
    df.groupby('Q').apply(lambda x:print(x))
           A  B  C   Q
        0  1  1  3  LI
        3  2  1  6  LI
           A  B  C   Q
        0  1  1  3  LI
        3  2  1  6  LI
           A  B  C     Q
        4  2  2  7  WANG
           A  B  C      Q
        1  1 -1  4  ZHANG
        2  1  0  5  ZHANG
    
     
    df.groupby('Q').agg(lambda x:print(x))
        0    1
        3    2
        Name: A, dtype: int64
        4    2
        Name: A, dtype: int64
        1    1
        2    1
        Name: A, dtype: int64
        0    1
        3    1
        Name: B, dtype: int64
        4    2
        Name: B, dtype: int64
        1   -1
        2    0
        Name: B, dtype: int64
        0    3
        3    6
        Name: C, dtype: int64
        4    7
        Name: C, dtype: int64
        1    4
        2    5
        Name: C, dtype: int64
     ABC
    Q   
    LI None None None
    WANG None None None
    ZHANG None None None

    从这个例子可以看出,使用apply()处理的对象是一个个的类如DataFrame的数据表,然而agg()则每次只传入一列。

    不过我觉得这一点区别在实际应用中分别并不大,因为Ipython的Out输出对于这两个函数几乎没有差别,不管是处理一列还是一表。

    我觉得agg()有一点让我很开心就是他可以同时传入多个函数,简直不要太方便哈哈:

    df.groupby('Q').agg(['mean','std','count','max'])
     ABC
     meanstdcountmaxmeanstdcountmaxmeanstdcountmax
    Q            
    LI 1.5 0.707107 2 2 1.0 0.000000 2 1 4.5 2.121320 2 6
    WANG 2.0 NaN 1 2 2.0 NaN 1 2 7.0 NaN 1 7
    ZHANG 1.0 0.000000 2 1 -0.5 0.707107 2 0 4.5 0.707107 2 5

    Plotting

    这个也是我刚刚学会的,groupby的plot简直不要太方便了:(不过这个例子选的不是很好)

    %matplotlib inline
    df.groupby('Q').agg(['mean','std','count','max']).plot(kind='bar')
    <matplotlib.axes._subplots.AxesSubplot at 0x1133bd710>
    

    这里写图片描述

    MultiIndex

    这个是困扰我最多的一个问题,因为如果我groupby的时候选择了两个level,之后的data总是呈现透视表的形式,如:

    Muldf = df.groupby(['Q','A']).agg('mean')
    print(Muldf)
                   B    C
        Q     A          
        LI    1  1.0  3.0
              2  1.0  6.0
        WANG  2  2.0  7.0
        ZHANG 1 -0.5  4.5

    我开始甚至以为这应该不是dataframe,是一个我可能没注意过的一个东西,可是后来我发现,这不过是MultiIndex形式的一种dataframe罢了。
    Muldf.B
        Q      A
        LI     1    1.0
               2    1.0
        WANG   2    2.0
        ZHANG  1   -0.5
        Name: B, dtype: float64
    如果要选择某一个index,用`xs()`函数:
    Muldf.xs('LI')
     BC
    A  
    1 1.0 3.0
    2 1.0 6.0

    PS:有个问题困扰好久了,怎么把multiindex对象变回原来的形式呢。如:

    Q      A    
    LI     1    1.0
    LI     2    1.0
    WANG   2    2.0
    ZHANG  1   -0.5

    求大佬解答,感激不尽~

    转载请注明原文链接,对本文有任何建议和意见请在评论区讨论,谢谢!
  • 相关阅读:
    Mybatis基础配置及增删查改操作
    SpringMVC注解方式与文件上传
    SpringMVC的基础配置及视图定位
    Spring AOP面向切面编程
    Spring注入属性、对象
    Spring的配置及jar包下载
    多线程
    集合框架
    I/O————流
    I/O————对象流
  • 原文地址:https://www.cnblogs.com/bjwu/p/8970818.html
Copyright © 2011-2022 走看看