pandas中分组/聚合函数的用法

一。对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

pandas中分组/聚合函数的用法_第1张图片

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)

你可能感兴趣的:(pandas)