大家好呀,我是你们的花姐~(转着咖啡杯,享受一下瘫坐工位的惬意时光)今天要聊个超真实的故事——上周五,快下班的时候,小美满脸愁容地抓住了我的袖子,眼睛红得像刚看完《长月烬明》的大结局:“花姐,老板让我每天统计各区销冠,我都快累成‘数据苦工’了!”😂 看着她那屏幕上密密麻麻的Excel表格,手动刷着VLOOKUP公式,简直就是现代版的《清明上河图》啊!今天就让Python帮她解救这一切!
一、手动统计的七宗罪(小美的血泪史)
- 数据分组地狱:每天要切换30+次筛选条件(大区×产品型号)
- 排名修罗场:每次都要手动标红TOP3,手抖标错就要重头再来
- 格式强迫症:合并单元格、调整边框、改字体颜色...美工看了都沉默
- 邮件焦虑症:每天09:05准时被老板钉钉:"报表呢?"(血压飙升预警💢)
二、Python自动化四步曲(带薪摸鱼指南)
先来看这个让运营小美崩溃的销售数据表(为了保护当事人,已做脱敏处理):
老板要求:按【大区+产品型号】每天统计销售额TOP3的业务员,并生成汇总报表。用Excel操作的话...👇
传统做法:
1️⃣ 先插入数据透视表
2️⃣ 手动拖拽字段到行/列
3️⃣ 设置值字段为销售额求和
4️⃣ 添加筛选条件
5️⃣ 复制结果到新表...
(后面的花姐已经编不下去了 🐢)
而用Python,只需要一杯咖啡的时间!☕ 上代码!
🪓 第1步:装备你的Python武器库
# 先安装必备库(装过的老铁可以跳过)
pip install openpyxl pandas
💡 花姐小贴士:记得用虚拟环境哦!不然库多了会打架的~
python -m venv excel_env
source excel_env/bin/activate # Linux/Mac
excel_env\Scripts\activate.bat # Windows
🎯 第2步:读取数据 - 让Excel自己爬进代码里
import pandas as pd
# 用pandas轻松读取Excel数据,无需担心中文表头
df = pd.read_excel('2024销售数据.xlsx', engine='openpyxl')
print(df.head(3)) # 先偷看前3行
输出结果如下
销售日期 大区 业务员 产品型号 销售额 联系电话
0 2024-03-23 华北 刘坤* PROD-006 2179 145****2056
1 2024-09-11 华西 涂军* PROD-020 6915 136****8452
2 2024-11-11 华南 侯桂* PROD-010 3300 132****7906
- 花姐小贴士💡:遇到编码报错时加个encoding='utf-8'保平安
🌀 第3步:分组统计 - 像整理衣柜一样整理数据
我们需要统计每个大区、每个产品型号的销售额TOP 3业务员。为此,我们可以按以下步骤操作:
- 按大区和产品型号分组:将数据按照“大区”和“产品型号”分组,计算每组的总销售额。
- 按销售额排序:每个大区+产品型号的组合中,按销售额降序排序,选出前3名。
- 生成报告:将结果整理成适合发给老板的报告。
# 按大区和产品型号分组,计算每个组合的销售总额
grouped = df.groupby(['大区', '产品型号', '业务员']).agg({'销售额': 'sum'}).reset_index()
print(grouped.head(10)) # 打印下前10条数据
输出结果
大区 产品型号 业务员 销售额
0 华东 PROD-001 何桂* 2450
1 华东 PROD-001 侯婷* 8311
2 华东 PROD-001 侯桂* 4273
3 华东 PROD-001 傅玉* 7516
4 华东 PROD-001 刁秀* 1517
5 华东 PROD-001 刘刚* 8889
6 华东 PROD-001 刘颖* 9597
7 华东 PROD-001 周桂* 5331
8 华东 PROD-001 周红* 17523
9 华东 PROD-001 国玉* 625
我通过Excel手动统计了下华东大区、产品PROD-001中周红*的销售数据,17523和Python计算的一致,说明到目前程序的计算是正确的。
接下来给分组数据做个排序,找出TOP3的销冠
# 按销售额降序排序,选出每组的前3名
top_3_sales = grouped.sort_values(['大区', '产品型号', '销售额'], ascending=[True, True, False])
# 给数据增加一个排名的列
top_3_sales['排名'] = top_3_sales.groupby(['大区', '产品型号']).cumcount() + 1
# 过滤出排名前3的销售员
top_3_sales_filtered = top_3_sales[top_3_sales['排名'] <= 3]
# 打印前几行看看结果
print(top_3_sales_filtered.head(10))
输出结果
大区 产品型号 业务员 销售额 排名
48 华东 PROD-001 陈秀* 22082 1
8 华东 PROD-001 周红* 17523 2
19 华东 PROD-001 李坤* 14305 3
82 华东 PROD-002 裴金* 22534 1
57 华东 PROD-002 刁秀* 14183 2
92 华东 PROD-002 韩飞* 14079 3
105 华东 PROD-003 张坤* 20987 1
95 华东 PROD-003 侯婷* 16379 2
106 华东 PROD-003 张璐* 14250 3
140 华东 PROD-004 侯婷* 25611 1
这次我们用excel的透视表对上面的数据做个验证,在华东地区、PROD-001产品的销冠和上面用Python的统计结果是一致的。
📄 第四步:优雅输出报表
# 将结果保存到新的Excel文件
from openpyxl.styles import NamedStyle, Font, PatternFill
def save_to_excel(data, output_file):
# 用openpyxl引擎写入(避免格式丢失)
writer = pd.ExcelWriter(output_file, engine='openpyxl')
# 先存数据
data.to_excel(writer, sheet_name='汇总报表', index=False)
# 再玩点花样:设置表头样式
worksheet = writer.sheets['汇总报表']
# 设置标题行背景色(老板最爱的商务蓝 💼)
header_style = NamedStyle(name="header_style",
fill=PatternFill(start_color="4F81BD", fill_type="solid"),
font=Font(color="FFFFFF", bold=True))
for cell in worksheet[1]:
cell.style = header_style
# 自动调整列宽(强迫症福音)
for column in worksheet.columns:
max_length = max(len(str(cell.value)) for cell in column)
worksheet.column_dimensions[column[0].column_letter].width = max_length + 5
writer.close()
print("报告生成完毕")
# 保存我们的战果 🏆
save_to_excel(top_3_sales_filtered, '销售排行榜.xlsx')
来看看销售排行榜最后的生成结果吧
三、避坑指南(血与泪的经验)
- 时间格式陷阱:用
pd.to_datetime()
统一日期格式,避免出现"2023/7/1"和"2023-07-01"的混战 - 分组暗礁:
groupby
之后一定要reset_index()
,否则索引会变成俄罗斯套娃
四、摸鱼后记
昨天路过小美工位,发现她显示器上赫然打开着《长相思》最新集,而电脑右下角的Outlook正在优雅地自动发送当日报告。她神秘兮兮地递给我一杯奶茶:"花姐,我现在每天能摸鱼2小时,这是 '摸鱼许可证' 工本费~"
所以啊,与其抱怨工作重复,不如让Python成为你的赛博奴隶(老板看不见我老板看不见我)。最后送大家一句花姐座右铭:"代码写得好,摸鱼摸到老!" 🎉