基于Pandas与Numpy,我们可以执行许多复杂的分组运算
第一个阶段,pandas对象(无论是Series、DataFrame还是其他的)中的数据会根据我们所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。然后将一个函数应用(apply)到各个分组并产生一个新值。最后,所有这些函数的执行结果会被合并(combine)到最终的结果对象中。结果对象的形式一般取决于数据上所执行的操作。
数据流如图所示:
我们建立一个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