DataWhale_Pandas Task04 分组

本文详细介绍了Pandas的分组操作,包括分组依据的本质、Groupby对象、分组的三大操作(聚合、变换和过滤)以及跨列分组。通过实例展示了如何使用聚合函数、agg方法、transform方法以及apply函数进行数据处理。文章还提供了多个练习题,帮助读者巩固分组操作的知识。
摘要由CSDN通过智能技术生成

第四章 分组

分组操作在日常生活中使用极其广泛,例如:

  • 依据 性别 分组,统计全国人口 寿命 的 平均值

  • 依据 季节 分组,对每一个季节的 温度 进行 组内标准化

  • 依据 班级 分组,筛选出组内 数学分数 的 平均值超过80分的班级

从上述的几个例子中不难看出,想要实现分组操作,必须明确三个要素:分组依据 、 数据来源 、 操作及其返回结果 。同时从充分性的角度来说,如果明确了这三方面,就能确定一个分组操作,从而分组代码的一般模式即:

df.groupby(分组依据)[数据来源].使用操作

例如第一个例子中的代码就应该如下:

df.groupby('Gender')['Longevity'].mean()

现在返回到学生体测的数据集上,如果想要按照性别统计身高中位数,就可以如下写出:

In [3]: df = pd.read_csv('data/learn_pandas.csv')

In [4]: df.groupby('Gender')['Height'].median()
Out[4]: 
Gender
Female    159.6
Male      173.4
Name: Height, dtype: float64

2. 分组依据的本质

前面提到的若干例子都是以单一维度进行分组的,比如根据性别,如果现在需要根据多个维度进行分组,该如何做?事实上,只需在 groupby 中传入相应列名构成的列表即可。例如,现希望根据学校和性别进行分组,统计身高的均值就可以如下写出:

In [5]: df.groupby(['School', 'Gender'])['Height'].mean()
Out[5]: 
School                         Gender
Fudan University               Female    158.776923
                               Male      174.212500
Peking University              Female    158.666667
                               Male      172.030000
Shanghai Jiao Tong University  Female    159.122500
                               Male      176.760000
Tsinghua University            Female    159.753333
                               Male      171.638889
Name: Height, dtype: float64

目前为止, groupby 的分组依据都是直接可以从列中按照名字获取的,那如果希望通过一定的复杂逻辑来分组,例如根据学生体重是否超过总体均值来分组,同样还是计算身高的均值。

首先应该先写出分组条件:

In [6]: condition = df.Weight > df.Weight.mean()

然后将其传入 groupby 中:

In [7]: df.groupby(condition)['Height'].mean()
Out[7]: 
Weight
False    159.034646
True     172.705357
Name: Height, dtype: float64

练一练

请根据上下四分位数分割,将体重分为high、normal、low三组,统计身高的均值。

 参考自:https://blog.csdn.net/apple_50678962/article/details/111597392

发现自己lambda的用法真的掌握的烂

从索引可以看出,其实最后产生的结果就是按照条件列表中元素的值(此处是 True 和 False )来分组,下面用随机传入字母序列来验证这一想法:

In [8]: item = np.random.choice(list('abc'), df.shape[0])

In [9]: df.groupby(item)['Height'].mean()
Out[9]: 
a    163.924242
b    162.928814
c    162.708621
Name: Height, dtype: float64

 此处的索引就是原先item中的元素,如果传入多个序列进入 groupby ,那么最后分组的依据就是这两个序列对应行的唯一组合:

In [10]: df.groupby([condition, item])['Height'].mean()
Out[10]: 
Weight   
False   a    160.193617
        b    158.921951
        c    157.756410
True    a    173.152632
        b    172.055556
        c    172.873684
Name: Height, dtype: float64

由此可以看出,之前传入列名只是一种简便的记号,事实上等价于传入的是一个或多个列,最后分组的依据来自于数据来源组合的unique值,通过 drop_duplicates 就能知道具体的组类别:

In [11]: df[['School', 'Gender']].drop_duplicates()
Out[11]: 
                           School  Gender
0   Shanghai Jiao Tong University  Female
1               Peking University    Male
2   Shanghai Jiao Tong University    Male
3                Fudan University  Female
4                Fudan University    Male
5             Tsinghua University  Female
9               Peking University  Female
16            Tsinghua University    Male

In [12]: df.groupby([df['School'], df['Gender']])['Height'].mean()
Out[12]: 
School                         Gender
Fudan University               Female    158.776923
                               Male      174.212500
Peking University              Female    158.666667
                               Male      172.030000
Shanghai Jiao Tong University  Female    159.122500
                               Male      176.760000
Tsinghua University            Female    159.753333
                               Male      171.638889
Name: Height, dtype: float64

3. Groupby对象

能够注意到,最终具体做分组操作时,所调用的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值