公众号后台回复“图书“,了解更多号主新书内容
作者:宁海涛
来源:DataCharm
今天我们继续推出一篇数据处理常用的操作技能汇总:灵活使用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()的核心,分别是:
第一步:分离(Splitting)原始数据对象;
第二步:在每个分离后的子对象上进行数据操作函数应用(Applying);
第三步:将每一个子对象的数据操作结果合并(Combining)。
而在Applying操作步骤中还可以进行以下数据操作处理:
聚合(Aggregation)处理:进行如平均值(mean)、最大值(max)、求和(sum)等一些统计性计算。
转换(Transformation)操作:执行一些特定于个别分组的数据处理操作,最常用的为针对不同分组情况选择合适的值填充空值;
筛选(Filtration)操作:这一数据处理过程主要是去除不符合条件的值,如根据均值和特定值筛选数据。
接下来我们通过具体的例子对各个步骤进行讲解。
首先,我们自己创建用于演示的数据,代码如下:
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
数据如下:
首先我们根据单一变量进行分组,如按照Team列进行分组,代码如下:
grouped = test_dataest.groupby('Team')
grouped
#
返回的是一个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")
结果如下:
一旦分组后,我们就可对分组后的对象进行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
除了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站也能学编程吗