我爱编程

Pandas组合操作

2018-01-26  本文已影响0人  lysh1987

在上一篇文章中介绍了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
上一篇下一篇

猜你喜欢

热点阅读