美文网首页我爱编程
Pandas组合操作

Pandas组合操作

作者: lysh1987 | 来源:发表于2018-01-26 23:37 被阅读0次

    在上一篇文章中介绍了panda合并操作的主要用法(https://www.jianshu.com/p/fe47c70d31f9),本篇将给大家介绍pandas的另一个常用的操作,groupby。
    本篇内容参考自http://pandas.pydata.org/pandas-docs/stable/groupby.html#groupby

    groupby

    使用groupby,我们是在进行下面的一个或多个操作:

    • Spliting:根据条件分组数据
    • Applying : 在各个分组上执行函数
    • Combining : 合并结果

    拆分单个对象 into groups

    常用方式为:

    # default is axis=0
    >>> grouped = obj.groupby(key)
    >>> grouped = obj.groupby(key, axis=1)
    >>> grouped = obj.groupby([key1, key2])
    

    如:

    In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
       ...:                           'foo', 'bar', 'foo', 'foo'],
       ...:                    'B' : ['one', 'one', 'two', 'three',
       ...:                           'two', 'two', 'one', 'three'],
       ...:                    'C' : np.random.randn(8),
       ...:                    'D' : np.random.randn(8)})
       ...: 
    
    In [2]: df
    Out[2]: 
         A      B         C         D
    0  foo    one  0.469112 -0.861849
    1  bar    one -0.282863 -2.104569
    2  foo    two -1.509059 -0.494929
    3  bar  three -1.135632  1.071804
    4  foo    two  1.212112  0.721555
    5  bar    two -0.173215 -0.706771
    6  foo    one  0.119209 -1.039575
    7  foo  three -1.044236  0.27186
    
    In [3]: grouped = df.groupby('A')
    
    In [4]: grouped = df.groupby(['A', 'B'])
    

    返回的是GroupBy 对象,可以看到,在需要操作之前不会发生Spliting。创建GroupBy对象只是保证传递了有效的映射。接下来再进行操作。如:

    In [13]: df2 = pd.DataFrame({'X' : ['B', 'B', 'A', 'A'], 'Y' : [1, 2, 3, 4]})
    #groupby之后分组求和
    In [14]: df2.groupby(['X']).sum()
    Out[14]: 
       Y
    X   
    A  7
    B  3
    #可以指定sort=False来关闭group操作中的排序,从而加速操作
    In [15]: df2.groupby(['X'], sort=False).sum()
    Out[15]: 
       Y
    X   
    B  3
    A  7
    

    我们可以通过get_group()方法获得group的结果

    In [16]: df3 = pd.DataFrame({'X' : ['A', 'B', 'A', 'B'], 'Y' : [1, 4, 3, 2]})
    
    In [17]: df3.groupby(['X']).get_group('A')
    Out[17]: 
       X  Y
    0  A  1
    2  A  3
    
    In [18]: df3.groupby(['X']).get_group('B')
    Out[18]: 
       X  Y
    1  B  4
    3  B  2
    

    GroupBy object 属性

    可以通过.groups属性获取groupby对象的group属性,如:

    In [19]: df.groupby('A').groups
    Out[19]: 
    {'bar': Int64Index([1, 3, 5], dtype='int64'),
     'foo': Int64Index([0, 2, 4, 6, 7], dtype='int64')}
    
    In [21]: grouped = df.groupby(['A', 'B'])
    
    In [22]: grouped.groups
    Out[22]: 
    {('bar', 'one'): Int64Index([1], dtype='int64'),
     ('bar', 'three'): Int64Index([3], dtype='int64'),
     ('bar', 'two'): Int64Index([5], dtype='int64'),
     ('foo', 'one'): Int64Index([0, 6], dtype='int64'),
     ('foo', 'three'): Int64Index([7], dtype='int64'),
     ('foo', 'two'): Int64Index([2, 4], dtype='int64')}
    
    In [23]: len(grouped)
    Out[23]: 6
    

    groupby多个index

    如下创建一个两层的index:

    In [27]: arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
       ....:           ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
       ....: 
    
    In [28]: index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
    
    In [29]: s = pd.Series(np.random.randn(8), index=index)
    
    In [30]: s
    Out[30]: 
    first  second
    bar    one      -0.919854
           two      -0.042379
    baz    one       1.247642
           two      -0.009920
    foo    one       0.290213
           two       0.495767
    qux    one       0.362949
           two       1.548106
    dtype: float64
    

    我们可以通过任何一层来对数据进行操作,如:

    In [31]: grouped = s.groupby(level=0)
    
    In [32]: grouped.sum()
    Out[32]: 
    first
    bar   -0.962232
    baz    1.237723
    foo    0.785980
    qux    1.911055
    dtype: float64
    

    或者这么指定level

    In [34]: s.sum(level='second')
    Out[34]: 
    second
    one    0.980950
    two    1.991575
    dtype: float64
    

    相关文章

      网友评论

        本文标题:Pandas组合操作

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