Pandas聚合操作 groupby和agg的用法归纳

笔者在打比赛过程中经常需要用到聚合操作,现将自己平常遇到的几种用法总结如下,便于大家和自己查询。

我们直接通过例子进行讲解,首先,我们来定义一个dataframe:

import pandas as pd
import numpy as np

# 自定义函数,便于后面使用
def fun(arrs):
    res = 100 * len(arrs)
    return res


df = pd.DataFrame({'key1':['a', 'a', 'b', 'b', 'a','a','a','a'],
                   'key2':['one', 'two', 'one', 'two', 'one','two','two','two'],
                   'data1':np.random.randint(0,5,8),
                   'data2':np.random.randint(0,5,8),
                   'data3':np.random.randint(0,5,8)})

生成的dataframe如下:
在这里插入图片描述

1. groupby聚合之后,只对一列进行操作

1.1 只进行一种统计

data1 = df.groupby(['key1', 'key2'])['data1'].sum()   
# 结果类型为Seris, index为复合index

结果如下:
在这里插入图片描述
返回的data1的类型是Series,它的index为聚合键,也可以看作由(key1,key2)组成的复合index。我们可以通过reset_index操作将其转化为dataframe这种更加直观的形式。

data2 = data1.reset_index()    
# 类型为dataframe, columns为key1, key2, data1; index为阿拉伯数字

在这里插入图片描述

1.2 进行多种统计,包括上面定义的自定义函数

当我们需要对选取的列运用多种统计函数的时候,我们需要用到**agg()**操作

data3 = df.groupby(['key1','key2'])['data1'].agg(['mean', 'count', fun])  
# agg里为列表,返回类型为dataframe, index为聚合键; columns为统计函数名称,即mean, count, fun

在这里插入图片描述
一般来说,这样的列名不是我们想要的,除了直接更改列名之外,我们可以直接在聚合的时候就指定列名,如下:

data4 = df.groupby(['key1','key2'])['data1'].agg({'data1_average':'mean', 'data1_number':'count', 'data1_function':fun})

在这里插入图片描述
返回值data4是dataframe类型,其中的columns列名变成了我们指定的字典的键,index仍为聚合键,我们可以通过reset_index()操作使之变成两列
在这里插入图片描述

2. groupby聚合之后,对所有列进行操作

2.1 只进行一种统计

如果我们聚合之后想对所有列进行操作,那么groupby之后就不需要指定列,直接跟统计函数即可:

data6 = df.groupby(['key1']).sum()   
# 类型为dataframe, index为聚合键, columns为data1, data2, data3; 
# 需要注意的是,不符合运算定义的key2列被忽略(key2这一列为字符串,没有sum函数)

在这里插入图片描述
其中聚合之后的列名仍为原来的列名,假如有需要,可以直接通过data6.columns属性进行修改。结果中不含key2列,这是因为key2这一列为字符串,没有sum函数,所以自动被忽略

2.2 进行多种统计,包括自定义函数

data7 = df.groupby(['key1']).agg(['mean', 'count', fun])
# 类型为dataframe, index为聚合键, columns为复合列名,

在这里插入图片描述
一般会通过对data7.columns属性进行修改,来符合我们平常的习惯

data7.columns = ['_'.join(x) for x in data7.columns]

在这里插入图片描述

3. groupby聚合之后,对列进行选择,但是对所有列都进行相同统计

3.1 只进行一种统计

data8 = df.groupby(['key1'])[['data1','data2']].sum()

在这里插入图片描述

3.2 进行多种统计

同样的,进行多种统计,我们需要用到agg函数

data9 = df.groupby(['key1'])[['data1','data2']].agg(['mean', 'count', fun])
# 结果为复合列名

在这里插入图片描述

4. groupby聚合之后,对列进行选择,并对不同的列进行不同的操作

要达到这种目的,我们对agg()函数里传入字典,字典的key为列名,value为对应的统计函数列表如下:

agg_dict1 = {'data1':['sum','count'], 'data2':['count'], 'key2':[fun]}
data10 = df.groupby(['key1']).agg(agg_dict1)
# 结果为复合键

在这里插入图片描述
我为什么把上面的统计函数列表加粗呢?这是因为,当每列都只需要进行一种统计操作的时候,字典的value为列表还是函数名,所产生的结果有所不同,如下:

agg_dict2 = {'data1':'sum', 'data2':'count', 'key2':fun}
data11 = df.groupby(['key1']).agg(agg_dict2)
agg_dict3 = {'data1':['sum'], 'data2':'count', 'key2':fun}
data12 = df.groupby(['key1']).agg(agg_dict3)

在这里插入图片描述
结果的列名一个是原来的列名,一个是复合列名。我的理解是,当统计函数包含在列表里的时候,就默认为可能需要进行多种统计,所以聚合之后的列名就不能再是原来的列名(否则区分不开)

好啦,笔者目前见过的关于groupby和agg的聚合操作基本就这些啦,希望对大家有帮助~

  • 23
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Pandas中,groupby函数可以根据指定的列对DataFrame进行分组,并对每个分组应用聚合函数。agg函数是groupby函数的一个参数,用于指定要应用的聚合函数。例如,可以使用agg函数来计算每个分组中的最大值、平均值和总和。 使用agg函数时,可以将聚合函数作为一个列表传递给f_agg参数。例如,可以使用['max', 'mean', 'sum']来计算每个分组中的最大值、平均值和总和。 另外,groupby对象还有其他一些有用的方法,如transform和apply。transform方法可以对每个分组进行操作,并返回一个与原始DataFrame具有相同形状的新DataFrame。例如,可以使用transform方法来填充每个分组中的空值。 apply方法可以对每个分组应用自定义的函数,并返回一个包含结果的新DataFrame。例如,可以使用apply方法来填充每个分组中的空值。 综上所述,使用groupby的agg方法可以对DataFrame进行分组并应用聚合函数,而transform和apply方法可以对每个分组进行操作,并返回一个新的DataFrame。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Pandas DataFrame: groupby agg的使用](https://blog.csdn.net/chenhepg/article/details/125567150)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值