分组键可以有多种形式,且类型不必相同
a.列表或数组,且长度与待分组的轴一样
b.表示DataFrame某个列的值
c.字典或Series,给出待分组轴上的值与分组名之间的对应关系
d.函数,用于处理轴索引或索引中的各个标签
df=DataFrame({'key1':['a','a','b','b','a'],
'key2':['one','two','one','two','one'],
'data1':np.random.randn(5),
'data2':np.random.randn(5)})
print df
结果为:
data1 data2 key1 key20 -0.313764 -1.072629 a one
1 -0.528144 1.189622 a two
2 0.774314 0.489076 b one
3 -0.472739 -0.222977 b two
4 0.869980 2.184111 a one
假设想按key1进行分组,并计算data1列的平均值。
grouped=df['data1'].groupby(df['key1'])print grouped.mean()
结果为:
key1
a 0.009357
b 0.150788
Name: data1, dtype: float64
数据(Series)根据分组键进行了聚合,产生了一个新的Series,其索引为key1列中的唯一值。
如果我们一次传入多个数组,就会得到不同的结果
means=df['data1'].groupby([df['key1'],df['key2']]).mean()
print means
结果为:
key1 key2
a one 0.210008
two -0.235437
b one 1.218374
two -1.650944
Name: data1, dtype: float64
print means.unstack()
结果为:
key2 one two
key1
a -0.999244 -0.196333
b -1.373276 -0.193712
在上面的示例中,分组键均为Series。实际上,分组键可以是任何长度适当的数组
states=np.array(['Ohio','California','California','Ohio','Ohio'])
years=np.array([2005,2005,2006,2005,2006])
print df['data1'].groupby([states,years]).mean()
结果为:
California 2005 -1.483611
2006 1.493843
Ohio 2005 0.098908
2006 0.197631
Name: data1, dtype: float64
此外,还可以将列名用作分组键
print df.groupby('key1').mean()
print df.groupby([df['key1'],df['key2']]).mean()
结果为:
data1 data2
key1
a -0.193688 -0.548340
b -0.877449 -0.038743
data1 data2
key1 key2
a one 0.180915 -0.584049
two -0.942894 -0.476924
b one -0.431921 -0.396192
two -1.322977 0.318706
无论你准备拿groupby做什么,都有可能会用到GroupBy的size方法,它可以返回一个包含分组大小的Series
print df.groupby([df['key1'],df['key2']]).size()
结果为:
key1 key2
a one 2
two 1
b one 1
two 1
dtype: int64
1.对分组进行迭代
GroupBy对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)