Pandas学习(三)

分组

SAC过程

SAC指的是分组操作中的split-apply-combine过程。split指基于某一些规则,将数据拆成若干组,apply是指对每一组独立地使用函数,combine指将每一组的结果组合成某一类数据结构

以解决如下问题:

  • 整合(Aggregation)——即分组计算统计量(如求均值、求每组元素个数)
  • 变换(Transformation)——即分组对每个单元的数据进行操作(如元素标准化)
  • 过滤(Filtration)——即按照某些规则筛选出一些组(如选出组内某一指标小于50的组)
  • 上述三种问题的综合

groupby 函数

**DataFrame.groupby(self, by=None, axis=0, level=None, as_index: bool = True, sort: bool = True, group_keys: bool =
True, squeeze: bool = False, observed: bool = False) → ‘groupby_generic.DataFrameGroupBy’**使用映射器或按一系列列对DataFrame进行分组.

  • by: mapping, function, label, or list of labels 用于确定分组依据的分组。如果by是函数,则在对象索引的每个值上调用它。如果by为dict或Series,则将使用Series或dict
    VALUES来确定组(将Series的值首先对齐;请参见.align()方法)。如果by为ndarray,则按原样使用这些值来确定组。标签或标签列表可以按中的列传递给分组self。注意,元组被解释为(单个)键。

  • level: int, level name, or sequence of such, default None 如果轴是MultiIndex(分层),则按一个或多个特定级别分组。

经过groupby后会生成一个groupby对象,该对象本身不会返回任何东西,只有当相应的方法被调用才会起作用

聚合、过滤和变换

1. 聚合(Aggregation)

常用聚合函数

所谓聚合就是把一堆数,变成一个标量,因此mean/sum/size/count/std/var/sem/describe/first/last/nth/min/max都是聚合函数

同时使用多个聚合函数 AGG()方法

**DataFrame.agg(self, func, axis=0, *args, * *kwargs)**使用指定轴上的一项或多项操作来进行Agg求和

func: function, str, list or dict 功能供AGG regating数据。如果是函数,则必须在传递DataFrame或传递给DataFrame.apply时起作用。

可接受的组合为:

  • 功能
  • 字符串函数名称
  • 功能和/或功能名称列表,例如 [np.sum, ‘mean’]
  • 轴标签的字典->函数,函数名称或此类列表。

拓展用法:

  1. 利用元组进行重命名 group_m.agg([('rename_sum','sum'),('rename_mean','mean')])

  2. 指定哪些函数作用哪些列grouped_mul.agg({'Math':['mean','max'],'Height':'var'})

  3. 使用自定义函数grouped_single['Math'].agg(lambda x:print(x.head(),'间隔'))

  4. 带参数的聚合函数

1
2
3
4
def f(s,low,high):
return s.between(low,high).max()
#判断是否组内数学分数至少有一个值在50-52之间
grouped_single['Math'].agg(f,50,52)

2. 过滤(Filteration)

**DataFrameGroupBy.filter(self, func, dropna=True, args, * kwargs) 返回一个DataFrame的副本,该副本中不包含不满足func指定的布尔条件的组中的元素

filter 函数是用来筛选某些组的(务必记住结果是组的全体),因此传入的值应当是布尔标量

  • f function 应用于每个子帧的功能。应该返回True或False。

  • dropna 删除未通过过滤器的组。默认为真;如果为False,则评估为False的组将填充NaN

3. 变换(Transformation)

DataFrame.transform(self,func,axis = 0, args, * kwargs ) →’DataFrame’**

func: function, str, list or dict 用于转换数据的功能。如果是函数,则必须在传递DataFrame或传递给DataFrame.apply时起作用。

可接受的组合为:

  • 功能
  • 字符串函数名称
  • 功能和/或功能名称列表,例如 [np.exp. ‘sqrt’]
  • 轴标签的字典->函数,函数名称或此类列表。

apply函数

**GroupBy.apply(self, func, *args, * *kwargs)**使用fun函数并将结果组合在一起.

apply函数的灵活性很大程度来源于其返回值的多样性:

  1. 标量返回值 df.groupby('School').apply(lambda x:x.max())

  2. 列表返回值 df.groupby('School').apply(lambda x:x-x.min()).head()

  3. 数据框返回值

1
2
3
4
5
df[['School','Math','Height']].groupby('School')\
.apply(lambda x:pd.DataFrame({'col1':x['Math']-x['Math'].max(),
'col2':x['Math']-x['Math'].min(),
'col3':x['Height']-x['Height'].max(),
'col4':x['Height']-x['Height'].min()})).head()
  1. 助OrderedDict工具同时统计多个指标
1
2
3
4
5
6
7
8
from collections import OrderedDict
def f(df):
data = OrderedDict()
data['M_sum'] = df['Math'].sum()
data['W_var'] = df['Weight'].var()
data['H_mean'] = df['Height'].mean()
return pd.Series(data)
grouped_single.apply(f)
谢谢你请我吃糖果
0%