大家好,我是菜鸟小哥。groupby是Pandas在数据分析中最常用的函数之一。它用于根据给定列中的不同值对数据点(即行)进行分组,并且可以计算分组数据以生成分组的聚合值。如果我们有一个包含汽车品牌和价格信息的数据集,我们可以使用groupby函数来计算每个品牌的平均价格。在本文中,我们将通过25个例子来详细介绍groupby函数的用法。这25个示例中还包括一些不太常用但可以在各种任务中派上用场的操作。这里使用的数据集是随机生成的,我们将其视为销售数据集。importpandasaspdsales=pd.read_csv("sales_data.csv")sales.head()1.单列聚合我们可以这样计算每个店铺的平均库存数量:sales.groupby("store")["stock_qty"].mean()#OutputstoreDaisy1811.861702Rose1677.680000Violet14622.406061Name:stock_qty,dtype:float642,multi-columnaggregation在一个操作中进行多个聚合。以下是我们如何计算每个商店的平均库存数量和价格。sales.groupby("store")[["stock_qty","price"]].mean()3.多列多聚合我们也可以使用agg函数计算多个聚合值。sales.groupby("store")["stock_qty"].agg(["mean","max"])4.聚合结果的命名在前面两个例子中,并不清楚聚合列代表什么。例如,“均值”并没有告诉我们均值是什么。在这种情况下,我们可以命名聚合的结果。要聚合的列名和函数名需要写在一个元组中。sales.groupby("store").agg(avg_stock_qty=("stock_qty","mean"),max_stock_qty=("stock_qty","max"))5、多个聚合和多个函数sales.groupby("store")[["stock_qty","price"]].agg(["mean","max"])6.命名不同列的聚合7.as_index参数sales.groupby("store").agg(avg_stock_qty=("stock_qty","mean"),avg_price=("price","mean"))如果groupby操作的输出是一个DataFrame,可以使用as_index参数让他们成为DataFrame中的一列。sales.groupby("store",as_index=False).agg(avg_stock_qty=("stock_qty","mean"),avg_price=("price","mean"))8.多列分组就像我们一样我们可以聚合多列,我们也可以使用多列进行分组。sales.groupby(["store","product_group"],as_index=False).agg(avg_sales=("last_week_sales","mean")).head()为每个商店和产品组合生成一个组。9.排序输出可以使用sort_values函数根据聚合列对输出进行排序。sales.groupby(["store","product_group"],as_index=False).agg(avg_sales=("last_week_sales","mean")).sort_values(by="avg_sales",ascending=False).head()值这些行根据平均销售额按降序排列。10.最大的TopNmax函数返回每组的最大值。如果我们需要n个最大值,我们可以使用下面的方法:sales.groupby("store")["last_week_sales"].nlargest(2)storeDaisy4131883231947Rose948883263623Violet99132223392690Name:last_week_sales,dtype:int6411,最小的TopN和最大值类似,也可以求最小值sales.groupby("store")["last_week_sales"].nsmallest(2)12,第n个值是其他比上面的2还找到集合中的第n个值。sales_sorted=sales.sort_values(by=["store","last_month_sales"],ascending=False,ignore_index=True)求每个店铺上个月排名第五的商品如下:sales_sorted.groupby("store")。第nth(4)个输出包含每个组的第5行。由于行是根据上个月的销售额排序的,因此我们将获得上个月销售额第五高的行。13.对于第n个值,负的第n项也可以用来逆序排序。例如,“nth(-2)”返回倒数第二行。sales_sorted.groupby("store").nth(-2)14.unique函数可以用来在每个组中找到唯一值。例如,可以找到每个组中的唯一产品代码:sales.groupby("store",as_index=False).agg(unique_values=("product_code","unique"))15.uniquevalues也可以使用nunique函数求出每组中唯一值的个数。sales.groupby("store",as_index=False).agg(number_of_unique_values=("product_code","nunique"))16.Lambda表达式可以在agg函数中用作自定义聚合操作。sales.groupby("store").agg(total_sales_in_thousands=("last_month_sales",lambdax:round(x.sum()/1000,1)))17.Apply函数使用apply函数将Lambda表达式应用于每个团体。例如,我们可以对每个商店的上周销售额和上个月季度销售额之间的差异进行平均,如下所示:sales.groupby("store").apply(lambdax:(x.last_week_sales-x.last_month_sales/4).mean())storeDaisy5.094149Rose5.326250Violet8.965152dtype:float6418,dropna默认情况下,groupby函数会忽略缺失值。如果分组列中缺少某个值,则该值不会包含在任何组中,也不会单独显示。所以你可以使用dropna参数来改变这个行为。让我们从添加一个缺少存储值的新行开始。sales.loc[1000]=[None,"PG2",10000,120,64,96,15,53]然后计算每个店铺有无dropna参数的均价,看看有什么区别。sales.groupby("store")["price"].mean()storeDaisy69.327426Rose60.513700Violet67.808727Name:price,dtype:float64看设置缺失值参数的结果:sales.groupby("store",dropna=False)["price"].mean()storeDaisy69.327426Rose60.513700Violet67.808727NaN96.000000Name:price,dtype:float64groupby函数的dropna参数,使用pandas1.1.0以上版本。19、求组数有时需要知道生成了多少组,这可以使用ngroups。sales.groupby(["store","product_group"]).ngroups18在store和productgroup列中有18个不同值的不同组合。20.获取特定组get_group函数可以获取特定组,返回一个DataFrame。例如,我们可以获取属于商店“Daisy”和产品组“PG1”的行,如下所示:aisy_pg1=sales.groupby(["store","product_group"]).get_group(("Daisy","PG1"))daisy_pg1.head()21.rank函数rank函数用于根据给定列中的值对行分配排名。我们可以使用rank和groupby函数分别对每个组中的行进行排序。sales["rank"]=sales.groupby("store"["price"].rank(ascending=False,method="dense")sales.head()22.累加运算可以计算出每组的累加和。将numpy导入为npdf=pd.DataFrame({"date":pd.date_range(start="2022-08-01",periods=8,freq="D"),"category":list("AAAABBBB"),"value":np.random.randint(10,30,size=8)})我们可以创建一个单独的列,其中包含value列的累积和,如下所示:df["cum_sum"]=df.groupby("category")["value"].cumsum()23.扩容函数扩容函数提供扩容转换,但是对于扩容后的操作,还是需要一个累加函数来对堆区进行操作,比如与cumsum函数,结果将与sum函数相同。df["cum_sum_2"]=df.groupby("category")["value"].expanding().sum().values24.Cumulativeaverage使用扩展函数和均值函数计算累积平均值.df["cum_mean"]=df.groupby("category")["value"].expanding().mean().values25.展开后的最大值可以使用expand和max函数来记录该组当前的最大值。df["current_highest"]=df.groupby("category")["value"].expanding().max().values在Pandas中,groupby函数和聚合函数共同构成了一个高效的数据分析工具。本文中的示例涵盖了groupby函数的大部分用例,希望对您有所帮助。
