数据处理技巧 | 带你了解Pandas.groupby() 常用数据处理方法


公众号后台回复“图书“,了解更多号主新书内容

作者:宁海涛

来源:DataCharm

今天我们继续推出一篇数据处理常用的操作技能汇总:灵活使用pandas.groupby()函数,实现数据的高效率处理,主要内容如下:

  • pandas.groupby()三大主要操作介绍

  • pandas.groupby()实例演示

pandas.groupby()三大主要操作介绍

说到使用Python进行数据处理分析,那就不得不提其优秀的数据分析库-Pandas,官网对其的介绍就是快速、功能强大、灵活而且容易使用的数据分析和操作的开源工具(pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool)。相信很多小伙伴都使用过,今天我们就详细介绍下其常用的分组(groupby)功能。大多数的Pandas.GroupBy() 操作主要涉及以下的三个操作,该三个操作也是pandas. GroupBy()的核心,分别是:

  1. 第一步:分离(Splitting)原始数据对象;

  2. 第二步:在每个分离后的子对象上进行数据操作函数应用(Applying);

  3. 第三步:将每一个子对象的数据操作结果合并(Combining)。

而在Applying操作步骤中还可以进行以下数据操作处理:

  • 聚合(Aggregation)处理:进行如平均值(mean)、最大值(max)、求和(sum)等一些统计性计算。

  • 转换(Transformation)操作:执行一些特定于个别分组的数据处理操作,最常用的为针对不同分组情况选择合适的值填充空值;

  • 筛选(Filtration)操作:这一数据处理过程主要是去除不符合条件的值,如根据均值和特定值筛选数据。

接下来我们通过具体的例子对各个步骤进行讲解。

pandas.groupby()实例演示

首先,我们自己创建用于演示的数据,代码如下:

import pandas as pd 
import numpy as np
# 生成测试数据
test_data = {'Team': ['A', 'A', 'B', 'B', 'C','D', 'D', 'D', 'A', 'E', 'E', 'A'],
             'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
             'values01':[876,789,863,673,741,812,756,788,694,701,804,690],
             'values02': [120, 208, 250, 330, 430,240 ,710 ,190,252 , 364,197,288]}
test_dataest = pd.DataFrame(test_data)
test_dataest

数据如下:

test_data

Splitting 分离操作

首先我们根据单一变量进行分组,如按照Team列进行分组,代码如下:

grouped = test_dataest.groupby('Team')
grouped

#<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000014A2F049A00>

返回的是一个DataFrameGroupBy object,当然,我们也可以两个或两个以上的变量进行分组操作:

grouped2 = test_dataest.groupby(["Team","Year"])
grouped2

返回同样是分组对象,那么我们如何查看分组后的各个小组的情况 以及分组后的属性呢?代码操作如下:

# 查看分组后的小组个数
len(grouped)
# 返回各个小组的情况
grouped.groups
#{'A': [0, 1, 8, 11], 'B': [2, 3], 'C': [4], 'D': [5, 6, 7], 'E': [9, 10]}
#注意:上面返回的数字为其对应的索引数(index)

而当我们需要查看具体某一个小组的情况时,我们可是使用如下方法:

# 获取A分组的情况
grouped.get_group("A")

结果如下:

查看A分组情况

Applying数据计算操作

一旦分组后,我们就可对分组后的对象进行Applying应用操作,这部分最常用的就是Aggregations摘要统计类的计算了,如计算平均值(mean),和(sum)等,下面我们通过实例解释:还是以上方数据为主,这次我们根据Year列进行分组:

grouped = test_dataest.groupby("Year")

在对分组后的grouped对象,我们使用aggregate()方法进行数据计算:

grouped = grouped.aggregate(np.sum)
grouped
aggregate操作

或者直接使用:

grouped = test_dataest.groupby("Year").sum()

结果都是一样的。

如果我们对多列数据进行Applying操作,同样还是计算和(sum),代码如下:

grouped2 = test_dataest.groupby(["Team","Year"]).aggregate(np.sum)
grouped2


aggregate对多列操作

除了sum()求和函数外,我们还列举几个pandas常用的计算函数,具体如下表:

函数(Function)描述(Description)
mean()计算各组平均值
size()计算分组大小
count()计算组个数
std()分组的标准偏差
var()计算分组的方差
describe()生成描述性统计
min()计算分组值的最小值
max()计算分组值的最大值

可能有小伙伴问了,能不能对每一个分组结果计算多个结果值?即同时计算平均值(mean)、求和(sum)。答案是当然可以的。如我们同时计算均值和和,代码如下:

grouped2 = test_dataest.groupby(["Team","Year"]).aggregate([np.mean,np.sum])
grouped2

注意:aggregate()中使用列表将多个计算函数列出,即可计算多个结果了,结果如下:

同时计算多个结果

可能还有小伙伴问“能不能将聚合计算之后的新的结果列进行重命名呢?”,该操作在实际工作中经常应用的到,如:根据某列进行统计,并将结果重新命名。在pandas以前的版本中需要自定义聚合操作,如下:

# 定义aggregation汇总计算
aggregations = {
    #在values01列上的操作
    'values01': { 
        #获取sum结果,并将该结果命名为 total_result
        'total_result': 'sum',  
        #获取mean结果,并将该结果命名为 average_result
        'average_result': 'mean', 
        #获取count统计结果,并将该结果命名为 num_result
        'num_result': 'count'
    },
    # 在values02列上的操作
    'values02': {     
        # Find the max, call the result "max_date" 
        'max_value': 'max',           
        'min_value': 'min',
        #计算最大最小值差
        'max-min': lambda x: max(x) - min(x)  
    }
}

#应用刚刚自己定义的aggregations
grouped4 = test_dataest.groupby(["Team"]).agg(aggregations)

而在 Pandas 0.25.0.版本后新增“named aggregation”操作,即对agg的结果进行重新命名,不必再自己定义了。则以上代码可更换如下:

grouped4 = test_dataest.groupby(["Team"]).agg(
    total_result = ("values01","sum"),
    average_result = ("values01","mean"),
    num_result = ("values01","count"),
    max_value = ("values02","max"),
    min_value = ("values02","min"),
    max_min = ("values02",lambda x: max(x) - min(x))
)
grouped4

计算结果如下:

重命名agg结果

接下来,我们再介绍Transformation(转换),这里我们举一个例子即可:

grouped = test_dataest.groupby(["Year"])
score = lambda x: (x - x.mean()) / x.std()
trans_result = grouped.transform(score)
trans_result

结果如下:

Transform操作

这样我们就可以使每个分组中的平均值为0,标准差为1了。该步骤日常数据处理中使用较少,大家若想了解更多,请查看Pandas官网。

最后一个 Applying 方法为筛选数据(Filtration),顾名思义,就是对所操作的数据集进行过滤操作。这里举一个例子大家就能明白了,即我们以Team列进行分组,并且希望我们的分组结果中每一组的个数都大于3,我们该如何分组呢?练习数据如下:

test_dataest

实现上述要求的代码操作如下:

groupby5 = test_dataest.groupby('Team').filter(lambda x: len(x) >= 3)

结果就是将分组后小组个数大于3的数据筛选出来,如下:

Filtration Result

以上就是对Pandas.groupby()操作简单的讲解一遍了,当然,还有更详细的使用方法没有介绍到,这里只是说了我自己在使用分组操作时常用的分组使用方法。

总结

这是第二篇关于数据处理小技巧的推文,本期介绍了Pandas.groupby()分组操作方法,重点介绍了几个常用的数据处理方法,希望可以帮助到大家,接下来我会继续总结日常数据处理过程中的小技巧,帮助大家总结那些不起眼但是经常遇到的数据处理小Tips

◆ ◆ ◆  ◆ ◆麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:


数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢
● 卧槽!原来爬取B站弹幕这么简单● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值