Pandas分类总结之:分组

1. 分组模式及其对象

1.1 分组的一般模式

df.groupby(分组依据)[数据来源].使用操作 实例df.groupby('Gender')['Height'].mean()

  • 单一维度分组

    • df.groupby('Gender')['Height'].mean()
  • 多维度分组

    • df.groupby(['School', 'Gender'])['Height'].mean()
  • 复杂逻辑分组

    • df.groupby(df.Weight > df.Weight.mean())['Height'].mean()

1.2 Groupby对象

gb = df.groupby(['School', 'Grade'])

  • gb.ngroups,分组个数
  • gb.groups,返回从组名组名映射到组索引列表组索引列表的字典
  • gb.size(),统计每个组的元素个数
  • gb.get_group(('values1','values2')),获取所在组对应的行

1.3 分组的三大操作

分组的三大操作:聚合、变换和过滤(aggtransformfilter)

  • 依据性别性别分组,统计全国人口寿命寿命的平均值平均值,每一个组返回一个标量值
  • 依据季节季节分组,对每一个季节的温度温度进行组内标准化组内标准化,每组返回的是一个Series类型
  • 依据班级班级筛选出组内数学分数数学分数的平均值超过80分的班级,返回的整个组所在行的本身,即返回了DataFrame类型

2.聚合函数

2.1 内置聚合函数

  • 内置聚合函数max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod

聚合函数当传入的数据来源包含多个列时,将按照列进行迭代计算

2.2 agg方法

gb = df.groupby('Grade')[['Height', 'Weight']]

  • gb.agg(['sum', 'idxmax', 'skew']),同时使用多个聚合函数;用列表的形式把内置聚合函数对应的字符串传入
  • gb.agg({'Height':['mean','max'], 'Weight':'count'}),对特定的列使用特定的聚合函数;以列名为键,以聚合字符串或字符串列表为值
  • 使用自定义的聚合函数
    • gb.agg(lambda x: x.mean()-x.min()),需要注意传入函数的参数是之前数据源中的列,逐列进行计算
    • gb.agg(my_func)
  • 对聚合结果的列名进行自定义命名
    • gb.agg([('range', lambda x: x.max()-x.min()), ('my_sum', 'sum')]),函数的位置改写成元组,元组的第一个元素为新的名字,第二个位置为原来的函数
    • gb.agg({'Height': [('my_func', my_func), 'sum'], 'Weight': [('range', lambda x:x.max())]}),对一个或者多个列使用单个聚合的时候,重命名需要加方括号,例如“Weight”

3.变换与过滤

3.1 变换函数与transform方法

  • 内置变换函数是累计函数:cumcount/cumsum/cumprod/cummax/cummin变换函数的返回值为同长度的序列,完成的是组内累计操作
  • gb.transform(lambda x: (x-x.mean())/x.std()),用自定义变换时需要使用transform方法,被调用的自定义函数,其传入值为数据源的序列,其最后的返回结果是行列索引与数据源一致的DataFrame

3.2 组索引与过滤

过滤在分组中是对于组的过滤,而索引是对于行的过滤

  • gb.filter(lambda x: x.shape[0] > 100),组的筛选,其中自定义函数的输入参数为数据源构成的DataFrame本身

4.跨列分组

4.1 apply函数

解决多列数据同时处理的计算

  • 返回标量

    def BMI(x):
        Height = x['Height']/100
        Weight = x['Weight']
        BMI_value = Weight/Height**2
        return BMI_value.mean()
    gb.apply(BMI)
    
  • 返回一维Series

    • 标量情况:结果得到的是 Series ,索引与 agg 的结果一致

      gb = df.groupby(['Gender','Test_Number'])[['Height','Weight']]

      gb.apply(**lambda** x: 0)

  • 返回二维DataFrame

    • Series情况:得到的是DataFrame,行索引与标量情况一致,列索引为Series的索引

      gb.apply(lambda x: pd.Series([0,0],index=['a','b']))

    • DataFrame情况:得到的是DataFrame,行索引最内层在每个组原先agg的结果索引上,再加一层返回的DataFrame行索引,同时分组结果DataFrame的列索引和返回的DataFrame列索引一致

      gb.apply(lambda x: pd.DataFrame(np.ones((2,2)), index = ['a','b'], columns=pd.Index([('w','x'),('y','z')])))

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值