Python中的pandas包中经常用到groupby的功能,基于经常与它联系在一起的apply, agg(aggregate)以及transform函数。下面对这四个函数做简要介绍,并给出常用代码示例。
0 几个函数的异同
groupby+agg简单总结:
groupby的功能:第一步,针对一个python的dataframe,函数groupby按照某一个/几个列/行的属性值进行分组筛选,返回结果为一个GroupBy对象,实质是一个字典,index是属性值,value是筛选出来的子dataframe,这一步可以简单理解为dataframe的拆分。
agg, apply, transform:第二步是数值统计与变换,针对不同index下得到的子dataframe,可以汇总计算它的统计属性,比如平均值、最大值、总和等等,这里面最简单的方法是采用agg进行,除此之外,还有transform,apply和filter功能(filter就不讲了)。
agg, transform, apply不同之处:
transform:针对dataframe的列的元素进行操作,因此返回的dataframe与原来等长,但不在原位进行操作。对于用平均值弥补缺失值很有用。
agg:常用操作,与Python内置函数结合运行速度比较快
apply:可以替代上述两个,比较灵活,在自定义函数下也可改变返回值的形状,也可以处理一些特殊情况。
下面分别详细介绍每一个函数。
1. pandas.DataFrame.groupby()
函数形式:DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=<no_default>, observed=False, dropna=True)
函数功能:groupby操作涉及拆分对象、应用函数和合并结果的某种组合。这可以用于对大量数据进行分组,并在这些分组上计算操作。
参数解读:
- by: 用来确定函数作用的group。如果by是函数,则作用于每一列;如果传入dict或者series,则作用于series和dict对应的group;如果传入ndarray,则按原样使用值来确定组;标签或者标签列表可以传入group。
- axis:输入0 or 'index',或者1 or 'columns',默认是0。
- level:整数型或者level name,如果输入为multiindex,用于制定特定的level。
- as_index:默认为True。对于聚合的输出,返回带有组标签作为索引的对象。只与DataFrame输入相关。
- sort:默认为True。对group按照key进行排序。
- group_keys: 默认为True。当后续调用apply函数时,将组键添加到index以标识块。
- squeeze:默认为False。如果可能,降低返回类型的维数,否则返回一致的类型。(1.1.0版本以后删除了)
- observed:默认为False。只对分组是分类变量起作用。
- dropna:默认为True。如果为True且组键包含NA值,则NA值连同行/列将被删除;如果为False, NA值也将被视为组中的键。
简单用法:
结合aggregate的最常见用法为:
df.groupby(by=['a', 'b']).agg({'age': 'sum', 'gender': 'mean'})
2. pandas.DataFrame.agg
函数形式:DataFrame.agg(func=None, axis=0, *args, **kwargs)
函数功能:针对特定的轴进行一个或者多个聚合操作。
参数解读:
- func:函数,可以为str, list或者dict类型。可接受的组合包括:函数,字符串形式的函数名,函数或函数名列表(如 [np.sum, 'mean']),轴标签字典->函数,函数名或此类的列表。
- axis:0 or ‘index’, 1 or ‘columns’,默认为0。如果0或'index',对每一列应用函数;如果1或'columns',应用函数到每一行。
简单应用:
# 针对每一列进行不同操作
df.agg({'A' : ['sum', 'min'], 'B' : ['min', 'max']})
# 针对不同列进行多项操作,并进行重命名
df.agg(x=('A', max), y=('B', 'min'), z=('C', np.mean))
里面可以用到的Python内置函数包括以下几个。推荐使用agg()和python内置函数进行运算。
count() – Number of non-null observations
sum() – Sum of values
mean() – Mean of values
median() – Arithmetic median of values
min() – Minimum
max() – Maximum
mode() – Mode
std() – Standard deviation
var() – Variance
更详细的列表参见https://pandas.pydata.org/pandas-docs/stable/user_guide/basics.html
3. pandas.DataFrame.apply
函数形式:DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), **kwargs)
函数功能:沿着dataframe的轴进行操作。
参数解读:
- func:解释同上。
- axis:解释同上。
- raw:布尔型,默认为False。确定是否将行或列作为Series或ndarray对象传递。如果设置为False,将每一行或每一列作为series传递给函数;如果设置为True,传递的函数将接收ndarray对象。如果只是应用NumPy缩减函数,可以设置为Ture,会获得更好的性能。
- result_type:{‘expand’, ‘reduce’, ‘broadcast’, None}, 默认为None。主要是确定返回值的类型(list-like, series, dataframe),除了该设定还需要考虑函数的功能。简单解释见下方代码。
简单应用
df.apply(np.sum, axis=1)
# 'expand': 返回值为列表类型
df.apply(lambda x: [1, 2], axis=1, result_type='expand')
0 1
0 1 2
1 1 2
2 1 2
# 'broadcast':结果将被广播到原始形状的DataFrame,原始的索引和列将被保留。
df.apply(lambda x: [1, 2], axis=1, result_type='broadcast')
A B
0 1 2
1 1 2
2 1 2
apply常用自定义函数,但自定义函数的效率慢。
4. pandas.DataFrame.transform
函数形式:DataFrame.transform(func, axis=0, *args, **kwargs)
函数功能:调用func函数生成带有转换值的DataFrame,生成的DataFrame将具有与self相同的轴长。
参数解释:同上。
简单代码:
# 采用lambda表达式
df.transform(lambda x: x + 1)
# 针对GroupBy对象
df.groupby('Date')['Data'].transform('sum')
df.groupby('c')['type'].transform(len)
df.groupby('key').transform(lambda x: x.fillna(x.mean()))
完结~
网友评论