4.如何用Pandas代替Excel做数据分析

张开发
2026/4/7 6:07:49 15 分钟阅读

分享文章

4.如何用Pandas代替Excel做数据分析
第1章 如何用Pandas代替Excel做数据分析1.1 从Excel到Pandas为什么需要迁移Pandas的数据转换和聚合功能对应Excel里的筛选排序→ 布尔索引、sort_values分类汇总→groupbyagg数据透视表→pivot_table掌握这些你就能告别手动拖拽字段用代码完成多维度统计。1.2 学习前的准备工作步骤1准备一份清洗好的订单数据如果你跟着上一章做了清洗已经有cleaned_orders.csv。如果没有可以用以下代码快速生成一份干净的数据10万行importpandasaspdimportnumpyasnp np.random.seed(42)n100000dfpd.DataFrame({order_id:[ORDstr(i).zfill(8)foriinrange(1,n1)],shop_name:np.random.choice([时尚女装旗舰店,潮流男装专营店,美妆优选,数码极客],n),category:np.random.choice([连衣裙,上衣,裤子,护肤品,手机],n),amount:np.random.uniform(10,2000,n).round(2),status:np.random.choice([已支付,已完成],n,p[0.8,0.2]),order_date:pd.date_range(2025-01-01,periodsn,freqmin)})df.to_csv(clean_orders.csv,indexFalse)print(已生成 clean_orders.csv共10万行)步骤2读取数据importpandasaspd dfpd.read_csv(clean_orders.csv,parse_dates[order_date])print(df.shape)df.head()⚠️ 实操避坑提醒Pandas的聚合操作对数据类型敏感。金额列必须是数值型日期列必须是datetime型。用df.dtypes检查如果类型不对先转换再聚合。第2章 筛选与排序2.1 条件筛选布尔索引电商场景筛选出金额≥500元的订单。high_valuedf[df[amount]500]print(f高价值订单数{len(high_value)})多个条件组合# 时尚女装旗舰店且金额≥500filtereddf[(df[shop_name]时尚女装旗舰店)(df[amount]500)]# 已支付 或 已完成df[df[status].isin([已支付,已完成])]2.2 排序sort_values()电商场景按金额降序排列找出最高金额订单。df_sorteddf.sort_values(amount,ascendingFalse)df_sorted.head(10)# 金额最高的10个订单多列排序先按店铺再按金额降序。df_sorteddf.sort_values([shop_name,amount],ascending[True,False])2.3 筛选排序组合电商场景找出时尚女装旗舰店中金额最高的5个订单。top5df[df[shop_name]时尚女装旗舰店].sort_values(amount,ascendingFalse).head(5)我的踩坑经历用sort_values时忘记ascendingFalse结果最小金额排第一以为店铺业绩很差。后来排查才发现排序方向反了。建议每次排序后打印前几行确认。第3章 分组聚合groupby3.1 单列分组聚合电商场景按店铺统计GMV总销售额和订单量。# 按店铺分组计算GMV和订单数shop_statsdf.groupby(shop_name).agg(gmv(amount,sum),order_cnt(order_id,count)).reset_index()print(shop_stats)输出示例shop_name gmv order_cnt 0 数码极客 9876543.21 25000 1 时尚女装旗舰店 12345678.90 30000 2 潮流男装专营店 8765432.10 22000 3 美妆优选 7654321.00 23000常用聚合函数sum()求和mean()平均值count()计数非空值min()/max()最小值/最大值nunique()去重计数3.2 多列分组电商场景按店铺 商品类目统计GMV。category_statsdf.groupby([shop_name,category]).agg(gmv(amount,sum),order_cnt(order_id,count)).reset_index()print(category_stats.head(10))3.3 多个聚合函数同时使用电商场景同时计算每个店铺的GMV、订单量、平均客单价、最大单笔金额。shop_multidf.groupby(shop_name).agg(gmv(amount,sum),order_cnt(order_id,count),avg_amount(amount,mean),max_amount(amount,max)).reset_index()# 添加客单价列GMV/订单数shop_multi[avg_order_value]shop_multi[gmv]/shop_multi[order_cnt]3.4 分组后排序电商场景找出GMV最高的店铺。shop_statsdf.groupby(shop_name)[amount].sum().sort_values(ascendingFalse)print(shop_stats)输出shop_name 时尚女装旗舰店 12345678.90 数码极客 9876543.21 潮流男装专营店 8765432.10 美妆优选 7654321.00 Name: amount, dtype: float64⚠️ 实操避坑提醒groupby后如果不加reset_index()结果是一个多层索引的DataFrame后续操作可能报错。建议在聚合后加上.reset_index()把分组字段变回普通列。第4章 数据透视pivot_table4.1 创建数据透视表电商场景制作店铺 × 类目的销售额矩阵类似Excel数据透视表。pivotpd.pivot_table(df,valuesamount,indexshop_name,columnscategory,aggfuncsum,fill_value0)print(pivot)输出示例category 上衣 连衣裙 裤子 手机 护肤品 shop_name 数码极客 1234567.80 0.00 2345678.90 4567890.12 1234567.80 时尚女装旗舰店 3456789.10 7890123.45 2345678.90 0.00 1234567.80 潮流男装专营店 2345678.90 0.00 3456789.10 0.00 2345678.90 美妆优选 0.00 0.00 0.00 1234567.80 6789012.30参数说明values要聚合的数值列通常是金额index行维度类似透视表的行标签columns列维度类似透视表的列标签aggfunc聚合函数可以是sum、mean、count等fill_value缺失值填充默认NaN这里填0更美观4.2 多级行索引和列索引电商场景按月份 店铺作为行类目作为列。# 先添加月份列df[month]df[order_date].dt.to_period(M)pivot_multipd.pivot_table(df,valuesamount,index[month,shop_name],columnscategory,aggfuncsum,fill_value0)print(pivot_multi)4.3 多种聚合函数电商场景同时看GMV和订单量。pivot_multi_aggpd.pivot_table(df,valuesamount,indexshop_name,columnscategory,aggfunc[sum,count],fill_value0)print(pivot_multi_agg)结果会有两层列索引第一层是sum和count第二层是类目名称。我的踩坑经历用pivot_table时忘记设置fill_value0结果透视表里很多NaN后续计算占比时报错。加上fill_value0后所有缺失位置都变成0公式计算就正常了。第5章 多级分组与时间聚合5.1 按年月分组电商场景按月统计GMV趋势。# 提取年月df[year_month]df[order_date].dt.strftime(%Y-%m)monthly_gmvdf.groupby(year_month)[amount].sum().reset_index()print(monthly_gmv)5.2 按店铺年月分组电商场景按月统计每个店铺的GMV。shop_monthlydf.groupby([shop_name,year_month])[amount].sum().reset_index()print(shop_monthly.head())5.3 计算占比电商场景计算每个店铺的GMV占全店总GMV的比例。total_gmvdf[amount].sum()shop_gmvdf.groupby(shop_name)[amount].sum()shop_ratio(shop_gmv/total_gmv*100).round(2)print(shop_ratio)电商场景计算每个店铺内各商品类目的销售占比。# 先按店铺类目分组shop_cat_gmvdf.groupby([shop_name,category])[amount].sum().reset_index()# 计算每个店铺的总GMVshop_totaldf.groupby(shop_name)[amount].sum().rename(shop_total)# 合并shop_cat_gmvshop_cat_gmv.merge(shop_total,onshop_name)# 计算占比shop_cat_gmv[pct](shop_cat_gmv[amount]/shop_cat_gmv[shop_total]*100).round(2)print(shop_cat_gmv.head())5.4 计算同比环比电商场景计算每月GMV的环比增长率。# 按月汇总monthlydf.groupby(df[order_date].dt.to_period(M))[amount].sum().reset_index()monthly.columns[month,gmv]# 计算环比monthly[prev_month_gmv]monthly[gmv].shift(1)monthly[mom_pct]((monthly[gmv]-monthly[prev_month_gmv])/monthly[prev_month_gmv]*100).round(2)print(monthly)⚠️ 实操避坑提醒用shift(1)计算环比时第一行的上一行是NaN环比也是NaN这是正常的。不要用fillna(0)填充否则会错误地把第一个月当成0增长。第6章 综合实操案例多维度运营分析6.1 案例背景使用clean_orders.csv10万行订单完成以下分析各店铺GMV和订单量排行各商品类目销售占比全店按月店铺统计GMV趋势制作店铺×类目销售矩阵透视表6.2 分步操作步骤1读取数据并添加辅助列importpandasaspd dfpd.read_csv(clean_orders.csv,parse_dates[order_date])df[month]df[order_date].dt.to_period(M)df[year_month]df[order_date].dt.strftime(%Y-%m)步骤2店铺GMV和订单量排行shop_statsdf.groupby(shop_name).agg(gmv(amount,sum),order_cnt(order_id,count)).reset_index().sort_values(gmv,ascendingFalse)print( 店铺GMV排行 )print(shop_stats)步骤3商品类目销售占比category_gmvdf.groupby(category)[amount].sum().sort_values(ascendingFalse)total_gmvcategory_gmv.sum()category_pct(category_gmv/total_gmv*100).round(2)print(\n 类目销售占比 )forcat,pctincategory_pct.items():print(f{cat}:{pct}%)步骤4按月店铺统计GMV趋势shop_monthlydf.groupby([shop_name,year_month])[amount].sum().reset_index()# 透视成表格形式便于查看trend_tableshop_monthly.pivot(indexyear_month,columnsshop_name,valuesamount).fillna(0)print(\n 月度店铺GMV趋势 )print(trend_table.head(12))步骤5店铺×类目销售矩阵pivot_matrixpd.pivot_table(df,valuesamount,indexshop_name,columnscategory,aggfuncsum,fill_value0)print(\n 店铺×类目销售矩阵 )print(pivot_matrix)步骤6保存结果到Excelwithpd.ExcelWriter(analysis_report.xlsx)aswriter:shop_stats.to_excel(writer,sheet_name店铺排行,indexFalse)category_pct.to_frame(name占比%).to_excel(writer,sheet_name类目占比)trend_table.to_excel(writer,sheet_name月度趋势)pivot_matrix.to_excel(writer,sheet_name店铺类目矩阵)print(分析报告已保存到 analysis_report.xlsx)6.3 结果解读店铺排行看出谁是GMV主力是否过度依赖单一店铺类目占比判断店铺的品类结构是否健康月度趋势发现增长或下滑的店铺及时预警销售矩阵找出每个店铺的优势类目和短板 电商数据合规提示在输出分析报告时只保留店铺名称、类目、金额等汇总字段不要包含用户ID、订单号等明细信息。Excel文件如果发给运营同事建议设置打开密码或仅通过内部共享目录传递。第7章 本章踩坑清单与合规总结7.1 新手常见踩坑场景错误操作正确做法groupby后操作忘记reset_index后续筛选报错聚合后加.reset_index()多条件筛选不用括号优先级问题(条件1) (条件2)透视表缺失值不设fill_value出现NaNfill_value0排序忘记ascendingFalse确认升序降序打印前几行验证时间分组直接对日期列groupby粒度过细先用dt.to_period(M)提取月份7.2 电商数据合规提示聚合数据脱敏groupby和pivot_table输出的都是汇总统计不包含用户明细合规风险较低。但要注意不要同时输出“店铺金额用户数”等可能反推个体信息的组合。报告分享分析报告中的Excel文件如果包含店铺核心经营数据应通过公司内部加密渠道传输不要用微信或网盘。数据留存分析完成后及时删除中间过程文件只保留最终报告和清洗脚本。第8章 结语Pandas的groupby和pivot_table是电商数据分析的核心武器。学会它们你就能用代码完成Excel数据透视表的所有功能而且处理速度更快、可重复性更强。下一章我会讲「NumPy基础与数值计算」教你如何用数组运算处理百万级金额数据。有问题的评论区留言我看到会回复。

更多文章