一。对Series进行的聚合
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],
'key2': ['one', 'two', 'one', 'two', 'one'],
'data1': np.random.randint(1, 10, 5),
'data2': np.random.randint(1, 10, 5)})
df
grouped = df['data1'].groupby(df['key1']).mean()
以data1的数据用key1【键】进行分组,mean()聚合函数
自定义分组的键
key=[1,2,1,1,2]
df['data1'].groupby(key).mean()
多层分组
df['data1'].groupby([df['key1'], df['key2']]).mean()
对DataFrame的分组和series基本相同
means = df.groupby(['key1', 'key2']).mean()['data1']
df.groupby(['key1', 'key2'])['data1'].mean()#以分组的结果进行平均值得计算。与上一个的结果一样
统计分组后每个分组的个数
df.groupby(['key1','key2']).size()
对分组进行迭代
for name, group in df.groupby('key1'):
print name
print group
pandas中的分组默认是按行进行分组的
通过创建字典实现按列分组
df = pd.DataFrame(np.random.randint(1, 10, (5, 5)),
columns=['a', 'b', 'c', 'd', 'e'],
index=['Alice', 'Bob', 'Candy', 'Dark', 'Emily'])
df
``
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190124100355369.png)
mapping = {‘a’: ‘red’, ‘b’: ‘red’, ‘c’: ‘blue’, ‘d’: ‘orange’, ‘e’: ‘blue’} #通过将列标签映射到不同的数据,进行分组,即构建一个分组的列
grouped = df.groupby(mapping, axis=1) #axis=1 指定按列进行分组
grouped.sum()
grouped.count()
通过函数来分组
df = pd.DataFrame(np.random.randint(1, 10, (5, 5)),
columns=[‘a’, ‘b’, ‘c’, ‘d’, ‘e’],
index=[‘Alice’, ‘Bob’, ‘Candy’, ‘Dark’, ‘Emily’])
df
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190124100612729.png)
def _dummy_group(idx):
print idx
return idx
df.groupby(_dummy_group) #传入的函数默认是按行进行分组,将行的索引传入函数
df.groupby(_dummy_group, axis=1) #将列的索引传入函数,反向相同的将分为一组
多层索引的分组
columns = pd.MultiIndex.from_arrays([[‘China’, ‘USA’, ‘China’, ‘USA’, ‘China’],
[‘A’, ‘A’, ‘B’, ‘C’, ‘B’]], names=[‘country’, ‘index’])
df = pd.DataFrame(np.random.randint(1, 10, (5, 5)), columns=columns)
df
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019012410080018.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1ODEwODM4,size_16,color_FFFFFF,t_70)
df.groupby(level=‘country’, axis=1).count() #默认按行进行分组,这儿是按列进行分组
df.groupby(level=‘country’, axis=1).sum()
--------------------------------------------------
自定义聚合函数
def peak_verbose(s):
print(type(s))
return s.max()-s.min()
def peak(s):
return s.max()-s.min()
grouped = df.groupby(‘key1’)
grouped.agg(peak_verbose)
#应用多个聚合函数
grouped[‘data1’,‘data2’].agg([‘mean’,‘std’,peak])
#给聚合后的列取名
grouped[‘data1’].agg([(‘agerage’, ‘mean’), (‘max-range’, peak)])
#不同的列用不同聚合函数
d = {‘data1’: [‘mean’, peak, ‘max’, ‘min’],
‘data2’: ‘sum’}
grouped.agg(d)
--------------------------------------------------
transform()的用法
将分组聚合这一步骤用一个函数实现
k1_mean= df.groupby(‘key1’).transform(np.mean).add_prefix(‘mean_’)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190124101620333.png)
df[k1_mean.columns] = k1_mean #直接将分组的记过添加,与之前的字典的新加值相同
df
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190124101639558.png)