python学习日记(分组运算)

基于Pandas与Numpy,我们可以执行许多复杂的分组运算

GroupBy分组机制

第一个阶段,pandas对象(无论是Series、DataFrame还是其他的)中的数据会根据我们所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。然后将一个函数应用(apply)到各个分组并产生一个新值。最后,所有这些函数的执行结果会被合并(combine)到最终的结果对象中。结果对象的形式一般取决于数据上所执行的操作。

数据流如图所示:

python学习日记(分组运算)_第1张图片

我们建立一个Datafram数据集:

import numpy as np
import pandas as pd
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],
                    'key2' : ['one', 'two', 'one', 'two', 'one'],
                    'data1' : np.random.randn(5),
                    'data2' : np.random.randn(5)})

这里我们选择按照key2进行分组,并计算data2的平均值,我们这里要用的是:访问data2,并根据key2调用GroupBy的mean方法来计算分组平均值:

grouped = df['data2'].groupby(df['key2'])
data2_average = grouped.mean()

这时,我们如果传入key1、key2两个索引则得出不同结果:

key1  key2
a     one     0.880536
      two     0.478943
b     one    -0.519439
      two    -0.555730

在上述例子中,分组键为series,其实key1、key2可以是任何长度适当的数组。

另外,GroupBy的size方法可以返回一个含有分组大小的Series:

size = f.groupby(['key1', 'key2']).size()
print(size)
key1  key2
a     one     2
      two     1
b     one     1
      two     1

对分组进行迭代

GroupBy对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)

for name, group in df.groupby('key1'):
    print(name)
    print(group)

结果为按照key1的不同分组

 key1     data1     data2
0    a -1.088142  0.894045
1    a -0.040777  0.552952
4    a  1.116719  0.979438
b
  key1     data1     data2
2    b -2.582169  0.131496
3    b -2.284920  1.906700

当多重键时,元组的第一个元素默认是由键值组成的元组:

for (k1, k2), group in df.groupby(['key1', 'key2']):
    print((k1, k2))
    print(group)

输出结果如图所示:

  key1 key2     data1     data2
0    a  one  1.122848  0.658638
4    a  one -1.575574  0.096988
('a', 'two')
  key1 key2     data1     data2
1    a  two -1.242042  0.371779
('b', 'one')
  key1 key2  data1     data2
2    b  one -0.075  0.492735
('b', 'two')
  key1 key2     data1     data2
3    b  two -0.298669  0.039236

你可能感兴趣的:(python)