数据分析还用Excel?该用Python卷同事了
作者:职场小袁同学 | 发布时间:2026年06月11日 08:14
在日常工作中,数据分析无处不在:销售报表、用户行为分析、财务对账、市场调研……过去,Excel是绝大多数人的首选工具。它确实强大——公式、透视表、图表、宏,能应付大部分场景。但随着数据量的增长和业务复杂度的提升,Excel的短板逐渐暴露:
- 数据量瓶颈:Excel单表最多1048576行,实际超过10万行就开始卡顿,超过50万行基本崩溃。
- 重复操作:每天导出一份报表,筛选、排序、做图、导出,操作步骤完全一致,但Excel无法自动执行。
- 版本混乱:通过邮件、微信传来传去的Excel文件,你永远不知道哪个是最新版。
- 缺乏可复现性:同事问你“这个数字怎么来的”,你只能回忆操作步骤,无法精确复现。
- 协作困难:多人同时编辑一个Excel文件,冲突、覆盖、数据损坏频繁发生。
Python作为一种通用编程语言,在数据分析领域具备无可比拟的优势:
- 处理海量数据:借助pandas库,可以轻松处理百万行、千万行级别的数据,内存管理高效。
- 自动化与可重复:写一次脚本,每天自动运行,结果一致,无需手动操作。
- 强大的生态:pandas、numpy、matplotlib、seaborn、scikit-learn等库覆盖数据读取、清洗、分析、可视化、建模全流程。
- 版本控制:代码可以用Git管理,谁改了哪里一目了然,数据源和代码分离,清晰可控。
- 跨平台与可移植:一份Python脚本可以在Windows、Mac、Linux上运行,不受Excel版本限制。
- 扩展性强:从简单的统计到机器学习模型,Python都能无缝衔接。
- 跨多个数据源(数据库、API、CSV、Excel)的整合分析
推荐使用Anaconda发行版,它预装了数据分析常用库,省去逐个安装的麻烦。
Windows/macOS/Linux通用步骤:
1. 访问 https://www.anaconda.com/download 下载对应系统版本(建议选择Python 3.9+版本)
2. 双击安装包,按提示完成安装(Windows用户注意勾选“Add Anaconda to my PATH environment variable”)
3. 验证安装:打开终端(Windows用cmd或PowerShell,macOS/Linux用Terminal),输入:
BASHIT职场小袁同学 · PYTHON.md
1python --version2# 应输出类似:Python 3.9.1334conda --version5# 应输出类似:conda 4.14.0
如果选择Miniconda或纯Python,手动安装以下库:
BASHIT职场小袁同学 · PYTHON.md
1pip install pandas numpy matplotlib seaborn openpyxl xlrd
pandasnumpymatplotlibseabornopenpyxlxlrd
创建一个Python脚本或直接在终端交互式环境测试:
PYTHONIT职场小袁同学 · PYTHON.md
1import pandas as pd2import numpy as np3import matplotlib.pyplot as plt4import seaborn as sns56print("pandas version:", pd.__version__)7print("numpy version:", np.__version__)8print("All libraries imported successfully!")
预期输出:
CODEIT职场小袁同学
1pandas version: 2.1.42numpy version: 1.25.23All libraries imported successfully!
常见异常及解决:
- ModuleNotFoundError: No module named 'pandas':说明未安装,执行
pip install pandas 即可。 - ImportError: DLL load failed(Windows特有):通常是Visual C++ Redistributable缺失,去微软官网下载安装最新版。
假设你是某电商公司的运营人员,每天需要处理一份包含订单数据的Excel文件(orders.xlsx),需要完成以下任务:
1. 读取Excel文件
2. 查看数据基本信息
3. 计算每个商品类别的总销售额
4. 将结果保存为新的Excel文件
PYTHONIT职场小袁同学 · PYTHON.md
1# -*- coding: utf-8 -*-2"""3电商订单数据分析基础示例4功能:读取Excel,计算各品类销售额,输出结果5"""67import pandas as pd89def analyze_orders(input_file, output_file):10 """11 分析订单数据,计算各品类销售额1213 Args:14 input_file: 输入Excel文件路径15 output_file: 输出Excel文件路径16 """17 try:18 # 1. 读取Excel文件19 print(f"正在读取文件: {input_file}")20 df = pd.read_excel(input_file, sheet_name='订单明细')2122 # 2. 查看数据基本信息23 print("\n=== 数据基本信息 ===")24 print(f"数据行数: {len(df)}")25 print(f"数据列数: {len(df.columns)}")26 print(f"列名: {list(df.columns)}")27 print(f"\n前5行数据预览:")28 print(df.head())29 print(f"\n数据类型:")30 print(df.dtypes)3132 # 3. 数据清洗:确保金额列为数值类型33 df['金额'] = pd.to_numeric(df['金额'], errors='coerce')34 # 删除金额为空的行35 df = df.dropna(subset=['金额'])3637 # 4. 按商品类别分组计算总销售额38 category_sales = df.groupby('商品类别')['金额'].agg(['sum', 'count', 'mean'])39 category_sales.columns = ['总销售额', '订单数', '平均单价']40 category_sales = category_sales.sort_values('总销售额', ascending=False)4142 print("\n=== 各品类销售额统计 ===")43 print(category_sales)4445 # 5. 保存结果46 category_sales.to_excel(output_file, sheet_name='品类分析')47 print(f"\n结果已保存至: {output_file}")4849 return category_sales5051 except FileNotFoundError:52 print(f"错误:找不到文件 {input_file}")53 print("请检查文件路径是否正确")54 return None55 except Exception as e:56 print(f"未知错误:{e}")57 return None5859# 执行分析60if __name__ == "__main__":61 input_path = "orders.xlsx"62 output_path = "category_analysis.xlsx"63 result = analyze_orders(input_path, output_path)
假设 orders.xlsx 内容如下:
运行后控制台输出:
CODEIT职场小袁同学
1正在读取文件: orders.xlsx23=== 数据基本信息 ===4数据行数: 55数据列数: 46列名: ['订单ID', '商品类别', '金额', '下单日期']78前5行数据预览:9 订单ID 商品类别 金额 下单日期100 1001 电子产品 2999 2024-01-01111 1002 服装 199 2024-01-01122 1003 电子产品 4599 2024-01-02133 1004 食品 59 2024-01-02144 1005 服装 399 2024-01-031516数据类型:17订单ID int6418商品类别 object19金额 int6420下单日期 object21dtype: object2223=== 各品类销售额统计 ===24 总销售额 订单数 平均单价25商品类别 26电子产品 7598 2 3799.00000027服装 598 2 299.00000028食品 59 1 59.0000002930结果已保存至: category_analysis.xlsx
异常1:ValueError: Sheet name '订单明细' not found
- 原因:Excel文件中没有名为“订单明细”的sheet
- 解决:先查看所有sheet名称:
xls = pd.ExcelFile(input_file); print(xls.sheet_names) - 修复:修改sheet_name参数为正确的名称,或使用
sheet_name=0 读取第一个sheet
异常2:KeyError: '金额'
- 原因:Excel中没有名为“金额”的列,可能是列名不同(如“销售额”“总价”)
- 解决
- 修复
异常3:MemoryError
- 原因
- 解决:分块读取或使用
dtype 参数指定列类型减少内存 - 修复:
df = pd.read_excel(input_file, dtype={'金额': 'float32'})
你是一家连锁零售公司的数据分析师,需要处理以下任务:
1. 数据源:3个Excel文件(销售明细、门店信息、商品目录)和1个CSV文件(每日库存) 2. 任务:
- 输出一份汇总Excel(包含多个sheet)和一张可视化图表
3. 数据规模:每个销售文件约50万行,总计150万行
PYTHONIT职场小袁同学 · PYTHON.md
1# -*- coding: utf-8 -*-2"""3零售数据分析进阶实战4功能:多源数据整合、清洗、分析、可视化5"""67import pandas as pd8import numpy as np9import matplotlib.pyplot as plt10import seaborn as sns11from datetime import datetime12import warnings13warnings.filterwarnings('ignore') # 忽略烦人的警告1415# 设置中文字体,避免图表乱码16plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']17plt.rcParams['axes.unicode_minus'] = False1819class RetailAnalyzer:20 """零售数据分析器"""2122 def __init__(self, data_dir="./data/"):23 self.data_dir = data_dir24 self.sales = pd.DataFrame()25 self.stores = pd.DataFrame()26 self.products = pd.DataFrame()27 self.inventory = pd.DataFrame()2829 def load_data(self):30 """加载所有数据源"""31 print("=" * 50)32 print("开始加载数据...")33 print("=" * 50)3435 # 1. 加载3个销售文件,合并为一个36 sales_files = ['sales_part1.xlsx', 'sales_part2.xlsx', 'sales_part3.xlsx']37 sales_list = []3839 for file in sales_files:40 try:41 df = pd.read_excel(self.data_dir + file)42 sales_list.append(df)43 print(f"✓ 已加载: {file} ({len(df)}行)")44 except FileNotFoundError:45 print(f"✗ 文件不存在: {file}")4647 if sales_list:48 self.sales = pd.concat(sales_list, ignore_index=True)49 print(f"✓ 合并后总行数: {len(self.sales)}")50 else:51 raise FileNotFoundError("没有找到任何销售文件!")5253 # 2. 加载门店信息54 self.stores = pd.read_excel(self.data_dir + 'stores.xlsx')55 print(f"✓ 门店信息: {len(self.stores)}家门店")5657 # 3. 加载商品目录58 self.products = pd.read_excel(self.data_dir + 'products.xlsx')59 print(f"✓ 商品目录: {len(self.products)}个商品")6061 # 4. 加载库存CSV62 self.inventory = pd.read_csv(self.data_dir + 'inventory.csv', encoding='utf-8')63 print(f"✓ 库存数据: {len(self.inventory)}条记录")6465 return self6667 def clean_data(self):68 """数据清洗"""69 print("\n" + "=" * 50)70 print("开始数据清洗...")71 print("=" * 50)7273 # 1. 去除重复行74 before_dedup = len(self.sales)75 self.sales = self.sales.drop_duplicates()76 dup_count = before_dedup - len(self.sales)77 if dup_count > 0:78 print(f"✓ 去除重复行: {dup_count}行")7980 # 2. 处理缺失值81 print(f"清洗前缺失值统计:")82 print(self.sales.isnull().sum())8384 # 销售日期缺失的行删除(关键字段)85 self.sales = self.sales.dropna(subset=['销售日期'])8687 # 金额缺失的用同类商品均价填充88 if '金额' in self.sales.columns:89 avg_amount = self.sales.groupby('商品ID')['金额'].transform('mean')90 self.sales['金额'] = self.sales['金额'].fillna(avg_amount)9192 # 3. 数据类型转换93 self.sales['销售日期'] = pd.to_datetime(self.sales['销售日期'])94 self.sales['金额'] = pd.to_numeric(self.sales['金额'], errors='coerce')95 self.sales['成本'] = pd.to_numeric(self.sales['成本'], errors='coerce')9697 # 4. 添加计算字段:毛利率98 self.sales['毛利率'] = (self.sales['金额'] - self.sales['成本']) / self.sales['金额']99 self.sales['毛利率'] = self.sales['毛利率'].clip(0, 1) # 限制在0-1之间100101 print(f"✓ 清洗后数据: {len(self.sales)}行")102 return self103104 def merge_data(self):105 """关联数据"""106 print("\n" + "=" * 50)107 print("开始关联数据...")108 print("=" * 50)109110 # 1. 关联商品信息(获取商品类别)111 self.sales = self.sales.merge(112 self.products[['商品ID', '商品类别', '品牌']],113 on='商品ID',114 how='left'115 )116 print(f"✓ 关联商品信息完成")117118 # 2. 关联门店信息(获取门店区域)119 self.sales = self.sales.merge(120 self.stores[['门店ID', '门店名称', '区域']],121 on='门店ID',122 how='left'123 )124 print(f"✓ 关联门店信息完成")125126 # 3. 检查关联失败的数据127 no_category = self.sales['商品类别'].isnull().sum()128 no_store = self.sales['门店名称'].isnull().sum()129 if no_category > 0:130 print(f"⚠ 警告: {no_category}行数据未匹配到商品类别")131 if no_store > 0:132 print(f"⚠ 警告: {no_store}行数据未匹配到门店信息")133134 return self135136 def analyze_sales(self):137 """分析销售数据"""138 print("\n" + "=" * 50)139 print("开始销售分析...")140 print("=" * 50)141142 # 1. 各门店每日销售额143 daily_store_sales = self.sales.groupby(144 ['门店名称', self.sales['销售日期'].dt.date]145 )['金额'].sum().reset_index()146 daily_store_sales.columns = ['门店名称', '日期', '日销售额']147148 # 2. 各商品类别销售额占比149 category_sales = self.sales.groupby('商品类别')['金额'].sum()150 category_pct = category_sales / category_sales.sum() * 100151152 print(f"\n=== 各品类销售额占比 ===")153 for cat, pct in category_pct.items():154 print(f"{cat:10s}: {pct:.1f}%")155156 # 3. 计算各门店最近两天的销售额变化157 latest_date = daily_store_sales['日期'].max()158 prev_date = latest_date - pd.Timedelta(days=1)159160 today_sales = daily_store_sales[daily_store_sales['日期'] == latest_date]161 yesterday_sales = daily_store_sales[daily_store_sales['日期'] == prev_date]162163 sales_change = today_sales.merge(164 yesterday_sales[['门店名称', '日销售额']],165 on='门店名称',166 how='left',167 suffixes=('_今日', '_昨日')168 )169 sales_change['变化率'] = (170 (sales_change['日销售额_今日'] - sales_change['日销售额_昨日'])171 / sales_change['日销售额_昨日'] * 100172 )173174 # 4. 找出销售额下降超过20%的门店175 declining_stores = sales_change[sales_change['变化率'] < -20]176177 print(f"\n=== 销售额下降超过20%的门店 ({len(declining_stores)}家) ===")178 for _, row in declining_stores.iterrows():179 print(f"{row['门店名称']:15s}: 今日{row['日销售额_今日']:.0f}元, "180 f"昨日{row['日销售额_昨日']:.0f}
声明:本文内容由AI小袁智能工作流自动生成,仅供参考学习。文中观点不代表本平台立场,如有侵权请联系删除。