在数据分析工作中,经常需要将数据根据某个(多个)字段划分为不同的群体(group)进行分析。在Pandas中,分组分析的主要运由groupby方法完成。这篇文章将详细介绍groupby用法以及对应的agg、transform、apply的用法。
我们还是以NBA著名球星勒布朗詹姆斯2020-2021赛季的数据为例进行分析,有关的数据可在https://download.csdn.net/download/hanyunkaka/27238024?spm=1001.2014.3001.5503进行下载。
import numpy as np
import pandas as pd
df = pd.read_csv("lbj-2020-2021-regular.csv",encoding="gbk")
1、agg用法
agg的用法较为简单,如果要计算詹姆斯对阵每个NBA球队时的平均得分,则
score_average = df.groupby("对手").agg({"得分":'mean'})
这段与下面的代码是等价的:
score_average = df.groupby("对手")["得分"].mean()
2、transform用法
transform与agg不同的地方在于,transform会对每一条数据求得相应的结果,同组内的数据结果相同,组内数据求完结果之后按照原索引的顺序返回结果。
举个简单的例子,如果要计算詹姆斯对阵每个NBA球队时的平均得分,并且把平均得分新建一列附在原数据上,一般做法为:
score_average_dict = df.groupby("对手")["得分"].mean().to_dict()
df["score_average"] = df["对手"].map(score_average_dict)
如果使用transform,则只需一行代码:
df["score_average"] = df.groupby("对手")["得分"].transform("mean")
3、apply用法
apply用法更为灵活,可以用于更为复杂的场景。如果要获得詹姆斯对阵每个NBA球队时的最高得分,则需要用到apply函数。
def highest_score(x):
df = x.sort_values(by=["得分"],ascending=True)
return df.iloc[-1:]
score_high = df.groupby("对手").apply(highest_score)