pandas 的 agg() 是 aggregate() 方法的简写别名,它能在指定轴上使用一个或多个操作进行聚合,对 Series、DataFrame 以及分组对象都有效。所谓聚合,就是将多个值经过计算产生一个值的过程。在 pandas 数据处理和数据分析过程中,我们按轴进行聚合,一个轴的数据聚合为一个值,如果是分组对象,一个分组的数据也可能聚合为一个值。
agg 是 aggregate 的别名,在指定轴上使用一个或多个操作进行聚合。建议使用 df.agg,而不是 df.aggregate。它的一般语法是:
以下是参数说明
- func : function, str, list 或者 dict。用于聚合数据的函数。如果是函数,则必须在传递给 DataFrame 或传递给 DataFrame.apply。可接受的组合为:
- 函数 function
- 字符串函数名 string function name
- 函数和/或函数名列表,如
- 轴标签->函数、函数名称或此类列表的字典
- 注:可不传,支持「嵌套重命名」(nested renamer)特殊语法,见下文介绍
- axis : {0 or 'index', 1 or 'columns'}, 默认 0
- 如果 0 或者 'index':将函数应用于每列
- 如果 1 或者 'columns': 将函数应用于每一行
- :要传递给“func”的位置参数
- :要传递给“func”的关键字参数
返回的数据有 scalar(标量), Series 或者 DataFrame,其中有:
- scalar : 当 Series.agg 调用单个函数时
- Series : 当 DataFrame.agg 调用单个函数时,Series.agg 调用多个函数时
- DataFrame : 当 DataFrame.agg 调用多个函数时
聚合操作始终在一个轴上执行,即索引轴(默认值)或列轴。这种行为不同于 的聚合函数(、、、、、),其中默认值是计算展平数组(flattened array)的聚合,例如 而不是 。
传递变异对象(此处变异对象为非序列类型对象)的函数可能会产生意外行为或错误,因此不受支持,用户定义函数需要第一个参数传递一个 Series 以进行计算。
func 的参数可以为 None 不传,这种情况下,全关键字(可多个)形式传入,支持:
- Series:支持 新索引名=聚合函数
- DataFrame:支持 新列名=(原列名,聚合函数) 命名聚合功能(或者嵌套重命名),实现聚合后的列自定义列名功能,用 pd.NamedAgg 可显示定义
- Grouby:也支持 新列名=(原列名,聚合函数) 命名聚合功能,同上
Series.agg 的应用和一般语法中介绍的一样,其中 axis 参数的取值为 {0 or ‘index’},并且不可指定其他值,仅与 DataFrame.agg 做了兼容。
以下是一些简单的示例:
Series 的 agg 不支持「嵌套重命名」(nested renamer)功能(关键字的值取元组,当然,这也没啥用)。
以下是一些简单的应用示例:
agg 支持「嵌套重命名」(nested renamer)特殊语法(原理见下文命名聚合 pd.NamedAgg 相关介绍,类似),如果无传入函数,而全为 关键字=(列名, 聚合函数) 形式会按重新标记处理。重新标记将关键字解析这对应的行索引,值取列名对应列的聚合函数计算结果。
agg 可以为分组对象调用方法,与 DataFrame 的一点不同是,DataFrameGroupBy 对象在使用 agg 时可以指定计算引擎(engine 参数)和 引擎的参数(engine_kwargs)。
语法为:
参数:
- func:function, str, list 或者 dict,有:
- 函数 function
- 字符串函数名 string function name
- 函数和/或函数名列表,如
- 轴标签->函数、函数名称或此类列表的字典
- 注:还可以接受指定了 engine='Numba' 的 Numba JIT 函数。此引擎仅支持传递单个函数。如果选择了 “numba”引擎,则函数必须是用户定义的函数,其值和索引分别作为函数签名中的第一个和第二个参数,每个组的索引都将传递给用户定义的函数,并且可以选择使用
- 注:支持「命名聚合」特殊语法,见下文 pd.NamedAgg
- engine:str, 默认 None,有:
- 'cython' : 通过cython的C扩展执行函数
- 'numba' : 通过numba中的JIT编译代码运行函数
- None : 默认为 “cython” 或全局设置 compute.use_numba
- engine_kwargs:dict, 默认 None,有:
- 对于 'cython' 引擎,没有可授受的参数
- 对于 'numba' 引擎, 引擎可以接受 nopython、nogil 和并行字典键。值必须为 True 或 False,默认值是 {'nopython':True,'nogil':False,'parallel':False},并将应用于函数
- :要传递给“func”的位置参数
- :要传递给“func”的关键字参数
返回:
- DataFrame
使用 engine='numba' 时,内部将不会出现“回退”行为,组数据和组索引将作为 numpy 数组传递给 JITed 用户定义函数,并且不会执行其他尝试。
一些示例:
为了控制每列具有不同聚合的输出名称,pandas 支持“命名聚合”:
在版本 1.3.0 中更改:生成的数据类型将反映聚合函数的返回值:
一些其他案例:
通常,输出列名应该是唯一的。不能将同一函数(或两个同名函数)应用于同一列。
pandas 允许您提供多个 lambda。在这种情况下,pandas 将破坏(匿名)lambda 函数的名称,并将 附加到每个后续lambda。
通过向聚合传递 dict,您可以对 DataFrame 的列应用不同的聚合:
时间重采样可以使用 agg,语法与 DataFrame 类似,为:
案例:
agg 可以为滚动窗口对象调用方法。语法与 DataFrame 类似,为:
示例:
agg 可以为扩展窗口对象调用方法。语法为:
示例如下:
「嵌套重命名」(nested renamer)功能可以利用 pd.NamedAgg 对象完成,它是一个 namedtuple 对象( 在 Python collections 内置库),在 pandas 源码中是这样定义的:
它是为了支持特定于列的聚合并控制输出列名,pandas 接受 GroupBy 中的特殊语法。它是 agg() 的“命名聚合”,其中关键字是输出列名(NamedAgg 位),值是元组,其第一个元素(column 位)是要选择的列,第二个元素(aggfunc 位)是要应用于该列的聚合。
NamedAgg 将字段 利用 namedtuple 进行耦合,以更清楚地说明参数是什么。通常,聚合方法(aggfunc 值)可以是可调用对象的别名或字符串别名。
例如:
pandas.NamedAgg 只是一个 namedtuple,也允许使用纯元组:
如果所需的输出列名不是有效的 Python 关键字,请构造一个字典并解压关键字参数,利用双星号解包的特性,我们可以给新列名指定一个不符合 Python 变量的名称:
在以上操作中,只有成对的(列,aggfunc),聚合函数的其他参数无法传递,如果想传递聚合函数其他参数( ),请使用 functools.partial() 应用这些参数。
关于为何要解包传入,这是 Python 传入关键字的技巧,所有关键字和值组成字典,因 agg 支持关键字参数是一个字典,它可以接受这个字典(我们平时看到的解包字典为 ),因此我们再将这个字典解包为字典,而解包外层不需要再加字典字面量。如果不理解的话可以感受下下边的例子:
对于 Python3.5 和更早版本,函数中 的顺序没有保留,这意味着输出列顺序不一致,为了确保顺序一致,Python 3.5 中的键(以及输出列)将始终进行排序。
命名聚合也适用于 Series groupby 聚合。在下例中,没有列选择,因此值只是函数:
这于命名聚合的实现原理是这样的。参数 fun 参数默认为 None,如果没有传入 fun 参数,而仅有关键字参数,会被解析为该功能的表达形式。
agg 的使用方法总结如下:
agg 支持的对象有:
- pandas.DataFrame.agg
- pandas.Series.agg
- pandas.core.groupby.GroupBy.agg
- pandas.core.groupby.DataFrameGroupBy.aggregate
- pandas.core.groupby.SeriesGroupBy.aggregate
- pandas.core.resample.Resampler.aggregate
- pandas.core.window.expanding.Expanding.aggregate
- pandas.core.window.rolling.Rolling.aggregate
- https://pandas.pydata.org/docs/user_guide/groupby.html#aggregation
- https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.agg.html
- https://pandas.pydata.org/docs/reference/api/pandas.core.groupby.DataFrameGroupBy.aggregate.html
- https://pandas.pydata.org/docs/reference/api/pandas.core.resample.Resampler.aggregate.html
- https://pandas.pydata.org/docs/reference/api/pandas.core.window.expanding.Expanding.aggregate.html
- https://pandas.pydata.org/docs/reference/api/pandas.core.window.rolling.Rolling.aggregate.html
- pandas 按版本统计测试通过和失败数量 2024-07-21 18:03:28
- pandas 按 ID 合并英文姓名 2023-11-14 22:35:59
- pandas 相同类型的值拼接在一起 2023-09-11 11:28:29
- pandas 对数据按分组进行描述统计 2023-08-30 19:05:30
- pandas 查找重复项并将值拆分列 2023-08-30 16:12:03
- pandas 分组后将组内数据转为有序列表 2023-08-28 16:12:19
- pandas 按组显示列值的列表 2022-11-22 16:07:58
- pandas 将连续数字分组求和 2022-07-04 16:37:40
- pandas 书单整理将同种书合并在一起 2022-05-15 22:38:20
- pandas 根据值数字显示列名排序 2022-01-15 10:45:36
- pandas 将列表转为以字符为键的字典 2022-01-14 14:18:05
- pandas 时序取当天开始时间和结束时间 2020-11-30 11:02:32
更新时间:2022-11-14 11:50:04 标签:pandas agg 聚合
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/15169.html