groupby + agg:数据分析 80% 的活就这两招

groupby + agg:数据分析 80% 的活就这两招
groupby agg数据分析 80% 的活就这两招“各品类销售额多少” “每个月的 GMV 趋势” “各部门绩效排名”这些问题的答案都是 groupby 聚合。Excel 里你要拉透视表、写 SUMIFPandas 里就两行。groupby 的本质分—算—合importpandasaspdimportnumpyasnp dfpd.DataFrame({部门:[技术,销售,技术,销售,技术,销售,市场,市场],姓名:[张三,李四,王五,赵六,孙七,周八,吴九,郑十],薪资:[15000,12000,18000,14000,20000,13000,11000,10000],绩效:[85,92,78,88,95,80,90,85],})# 各部门平均薪资print(df.groupby(部门)[薪资].mean())# 部门# 技术 17666.67# 市场 10500.00# 销售 13000.00三步骤按部门分组 → 对薪资求均值 → 合并输出。常用聚合函数groupeddf.groupby(部门)print(grouped[薪资].sum())# 求和print(grouped[薪资].mean())# 均值print(grouped[薪资].median())# 中位数print(grouped[薪资].max())# 最大值print(grouped[薪资].min())# 最小值print(grouped[薪资].std())# 标准差print(grouped[薪资].count())# 计数print(grouped[薪资].nunique())# 唯一值个数agg一次算多个指标# 对薪资同时算均值和总和resultdf.groupby(部门)[薪资].agg([mean,sum,count])result.columns[平均薪资,总薪资,人数]print(result)# 对不同列算不同指标resultdf.groupby(部门).agg({薪资:[sum,mean],绩效:[mean,max,min],})print(result)# 自定义聚合函数defrange_func(x):returnx.max()-x.min()resultdf.groupby(部门).agg({薪资:range_func})print(result)多级分组# 模拟更大数据集np.random.seed(42)salespd.DataFrame({year:np.random.choice([2024,2025,2026],100),quarter:np.random.choice([Q1,Q2,Q3,Q4],100),category:np.random.choice([手机,电脑,耳机],100),amount:np.random.randint(1000,10000,100)})# 多列 groupbyresultsales.groupby([year,category])[amount].sum()print(result)# unstack 转成透视表格式pivotresult.unstack()print(pivot)# 透视表一步到位pivotpd.pivot_table(sales,valuesamount,indexyear,columnscategory,aggfuncsum,fill_value0)print(pivot)transform保持原形状# transform 返回和原始数据一样长的结果dfpd.DataFrame({部门:[技术,销售,技术,销售,技术],薪资:[15000,12000,18000,14000,20000]})# 每人薪资 vs 部门平均df[部门均值]df.groupby(部门)[薪资].transform(mean)df[与均值差]df[薪资]-df[部门均值]print(df)agg返回的是分组后的汇总值行数变少transform返回的是和原始数据一样长的值。apply最灵活# 每个部门薪资最高的那个人deftop_earner(group):returngroup.nlargest(1,薪资)resultdf.groupby(部门,group_keysFalse).apply(top_earner)print(result)# 给每个部门的薪资排序组内排名df[组内排名]df.groupby(部门)[薪资].rank(ascendingFalse)print(df)实战销售数据分析np.random.seed(123)datespd.date_range(2026-01-01,2026-06-30,freqD)salespd.DataFrame({date:np.random.choice(dates,500),product:np.random.choice([手机,电脑,耳机,平板],500),city:np.random.choice([北京,上海,广州,深圳],500),amount:np.random.randint(500,15000,500),})# 各产品总销售额print( 产品销售额排名 )print(sales.groupby(product)[amount].sum().sort_values(ascendingFalse))# 每月销售额趋势sales[month]sales[date].dt.to_period(M)monthlysales.groupby(month)[amount].sum()print(f\n 月度销售额 \n{monthly})# 每城市最畅销产品city_productsales.groupby([city,product])[amount].sum()print(f\n 深圳最畅销 \n{city_product.loc[深圳].sort_values(ascendingFalse)})# 各产品的客单价和订单数statssales.groupby(product).agg(总销售额(amount,sum),订单数(amount,count),客单价(amount,mean),最高单(amount,max)).round(1)print(f\n 综合统计 \n{stats})新手常见坑坑1groupby 结果索引# groupby 结果可能有多级索引resultsales.groupby([city,product])[amount].sum()# 用 reset_index 展平resultresult.reset_index()坑2NaN 被分组忽略# 如果分组列有 NaN那行不会被计入任何组# 先 fillna 再 groupbydf[city]df[city].fillna(未知)坑3agg 里写错函数名# ❌ 函数名是字符串# df.groupby(x).agg(average) # 没有这个# ✅ 正确的 Pandas 聚合函数名df.groupby(x).agg(mean)动手试试按部门分组计算薪资的总和、均值、最大值、人数用 pivot_table 做一个按年份和季度交叉的销售额表用 transform 给每个员工加上组内排名写在最后groupby agg 就是 Pandas 的透视表引擎。80% 的数据分析问题能用这两招解决。多练、多试手感到了就熟了。下一篇讲 DataFrame 的合并——merge、concat、join多张表怎么优雅地拼在一起。

最新新闻

日新闻

周新闻

月新闻