从Excel转Python数据分析入门者必看:掌握pandas、numpy、matplotlib实战技巧,职场竞争力直接翻倍
你有没有这种感觉——每天对着Excel表格刷了几个小时,筛选、排序、VLOOKUP、透视表用得滚瓜烂熟,但遇到更大的数据量就卡死,或者老板突然说一句”把这个月的数据跟去年同比一下”,你就开始慌了。Excel是好用的工具,但它有上限。超过10万行数据,打开就是煎熬;几十个表要合并,复制粘贴到手抽筋;想做个动态可视化,还得靠截图拼凑。
别担心,这不是你能力的问题,是工具的限制。Python数据分析就是来帮你打破这个天花板的。今天咱不整那些虚的,直接上干货,让你看完就能上手,真正感受到”原来数据分析可以这么爽”。
先把环境搭起来,这一步别跳
很多教程一上来就教你写代码,结果你连环境都配不好,直接劝退。咱们稳稳来。
如果你用的是Windows,直接去官网下载Anaconda(https://www.anaconda.com/),它把Python和常用的数据分析包都打包好了,装上就能用。安装完打开Jupyter Notebook,浏览器里就会打开一个界面,左边是文件目录,右上角点”New”选Python 3,就是一个新的笔记本。这玩意儿比Excel还直观——代码、结果、图表全在一个页面里,改完代码重新跑一遍就能看到最新结果,特别适合边学边练。
装完之后,打开一个单元格,输入这行代码然后按Shift+Enter运行:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
print("环境配置完成,准备开始!")
看到”环境配置完成”这几个字了吗?恭喜你,你已经跨过了入门最难的一步。pandas是数据分析的核心库,numpy是处理数值计算的基础,matplotlib是用来画图的。三个包齐活,后面就是实战了。
pandas:Excel的超级升级版
说实话,pandas学起来最自然的一点就是——你已经在用Excel的逻辑了。DataFrame在pandas里就是”数据框”,跟Excel的表格几乎一模一样,有行有列有标题。但pandas能做Excel做不到的事:一次处理百万行数据、自动处理缺失值、多表关联查询像写SQL一样简单。
先来看个最实用的场景。假设你有一个销售数据文件sales_data.csv,里面是过去两年的销售记录,现在要你找出每个产品的总销售额和平均单价。用Excel你得建透视表,如果数据经常更新还得手动刷新。用pandas呢?
# 读取数据
df = pd.read_csv('sales_data.csv')
# 查看数据的基本信息——这步很重要,相当于Excel里的"选中全部看看长啥样"
print(df.shape) # 看看有多少行多少列
print(df.head()) # 看前5行,快速了解数据结构
print(df.dtypes) # 看看每列是什么数据类型
print(df.describe()) # 数值列的统计摘要,类似Excel的"描述性统计"
运行这几行之后,你会对数据有个整体的认识。接着处理那个核心问题:
# 按产品分组,计算总销售额和平均单价
summary = df.groupby('产品').agg(
总销售额=('销售额', 'sum'),
平均单价=('单价', 'mean'),
销售次数=('订单号', 'count'),
最大单笔=('销售额', 'max')
).round(2) # 保留两位小数
print(summary)
看到没?groupby相当于Excel的透视表分组,agg函数让你在一个操作里完成多个统计。而且这些数据现在都在内存里,你可以继续对它们做各种操作——筛选、排序、添加新列、跟其他表合并,完全不需要反复回到Excel。
筛选数据也是pandas的强项。Excel里你点下拉菜单筛选,pandas直接写条件:
# 找出销售额大于1000且地区是"华东"的记录
high_value_sales = df[(df['销售额'] > 1000) & (df['地区'] == '华东')]
# 找出产品名称包含"Pro"的记录
pro_products = df[df['产品'].str.contains('Pro', na=False)]
# 按销售额从高到低排序
sorted_sales = df.sort_values('销售额', ascending=False)
这几个符号可能看起来有点怪——&是”并且”,|是”或者”,~是”非”(取反)。记住这一点就够了。
处理缺失值是很多人的痛点。Excel里经常看到一堆空白单元格,函数用着用着就报错了。pandas有专门的工具:
# 看看哪些列有缺失值,各缺失多少
print(df.isnull().sum())
# 处理方式一:直接删除有缺失值的行
df_clean = df.dropna()
# 处理方式二:用列的平均值填充数值型的缺失值
df['单价'] = df['单价'].fillna(df['单价'].mean())
# 处理方式三:用前一个有效值填充(适合时间序列数据)
df['销售额'] = df['销售额'].fillna(method='ffill')
最后一个实战技巧——多表合并。Excel里用VLOOKAP或者XLOOKUP,数据量大就慢得离谱。pandas的merge函数跟SQL的JOIN一模一样:
# 假设你有两张表:销售明细和产品信息
sales = pd.read_csv('sales_detail.csv')
products = pd.read_csv('product_info.csv')
# 按产品ID合并两张表,保留所有销售记录
merged = pd.merge(sales, products, on='产品ID', how='left')
# 查看合并结果
print(merged.head())
print(merged.shape)
how='left'表示保留左表的所有记录,右表没有匹配的填NaN。还有how='inner'(只保留两边都有的)、how='outer'(全部保留,缺失的填NaN),按需选择就行。
numpy:数值计算的底层引擎
numpy说白了就是给Python加了一套专门处理数字的超级工具。它最厉害的地方在于向量化运算——对一整列数据做计算,不用写循环,速度比Python原生快几十倍甚至上百倍。
你可能觉得这没什么,但实际工作中这就是”能用”和”飞一样快”的区别。看看这个对比:
import numpy as np
# 创建一个包含100万条数据的数组
data = np.random.rand(1000000)
# 方法一:用Python原生循环(慢)
start = __import__('time').time()
result_python = [x * 2 for x in data]
print(f"原生循环耗时:{time.time() - start:.4f}秒")
# 方法二:用numpy向量化运算(快)
start = time.time()
result_numpy = data * 2
print(f"numpy向量化耗时:{time.time() - start:.4f}秒")
运行之后你会发现,原生循环可能要好几秒,numpy不到0.01秒。这就是为什么数据分析从业者离不开numpy。
numpy在pandas里无处不在,pandas的底层就是numpy。所以学好numpy的数组操作,对理解pandas帮助巨大。几个最常用的操作:
# 创建数组
arr = np.array([1, 2, 3, 4, 5])
arr_2d = np.array([[1, 2, 3], [4, 5, 6]]) # 二维数组
# 生成数据——这比Excel的序列功能强大太多了
np.random.seed(42) # 设置随机种子,保证结果可复现
random_data = np.random.randn(100) # 标准正态分布
uniform_data = np.random.uniform(0, 100, 100) # 0到100的均匀分布
dates = pd.date_range('2024-01-01', periods=365, freq='D') # 生成一整年的日期
# 数组运算
print(arr + 10) # 每个元素加10
print(arr * arr) # 每个元素平方
print(np.sum(arr)) # 求和
print(np.mean(arr)) # 平均值
print(np.std(arr)) # 标准差
print(np.max(arr)) # 最大值
print(np.min(arr)) # 最小值
# 数组索引和切片——跟Python列表一样,但支持多维
print(arr[0]) # 第一个元素
print(arr[1:4]) # 第2到第4个元素
print(arr[arr > 3]) # 找出大于3的元素——这招特别好用
# 二维数组的操作
print(arr_2d[:, 0]) # 第一列
print(arr_2d[0, :]) # 第一行
print(arr_2d[1:3, 0:2]) # 取中间一块区域
numpy还有一个特别实用的功能——条件筛选和统计。在Excel里你要用很多函数组合才能完成的事,numpy一行代码就搞定:
# 模拟一个月的气温数据(30天)
temperatures = np.array([22, 25, 23, 28, 30, 27, 24, 26, 29, 31,
23, 22, 25, 27, 30, 28, 26, 24, 23, 25,
27, 29, 32, 30, 28, 26, 25, 24, 23, 22])
# 找出高于25度的天数
hot_days = temperatures[temperatures > 25]
print(f"高于25度的天数:{len(hot_days)}天")
print(f"这些天的平均温度:{np.mean(hot_days):.1f}°C")
# 找出温度变化最大的相邻两天
changes = np.diff(temperatures) # 计算相邻元素的差
max_change_idx = np.argmax(np.abs(changes))
print(f"温度变化最大的是第{max_change_idx}天到第{max_change_idx+1}天,")
print(f"变化了{changes[max_change_idx]}°C")
np.diff计算差分,np.argmax找最大值的索引——这些函数在Excel里根本没有,用起来特别顺手。
matplotlib:让数据自己说话
做完数据分析,最后一步往往是呈现结果。Excel的图表功能其实够用,但定制化程度低,样式千篇一律。matplotlib是Python里最经典的绘图库,学会它,你能画出任何你想要的图表。
先从最基础的开始——画一个折线图:
# 准备数据
months = ['1月', '2月', '3月', '4月', '5月', '6月']
sales = [12000, 15000, 18000, 22000, 25000, 30000]
# 创建图表
fig, ax = plt.subplots(figsize=(10, 6)) # 设置画布大小
ax.plot(months, sales, marker='o', linewidth=2, markersize=8, color='#2E86AB')
ax.set_title('2024年上半年销售额趋势', fontsize=16, fontweight='bold', pad=15)
ax.set_xlabel('月份', fontsize=12)
ax.set_ylabel('销售额(元)', fontsize=12)
ax.grid(True, alpha=0.3) # 加网格线,看起来更专业
ax.fill_between(months, sales, alpha=0.2) # 填充颜色,更有层次感
# 在数据点上标注数值
for i, v in enumerate(sales):
ax.text(i, v + 800, f'{v:,}', ha='center', fontsize=10)
plt.tight_layout()
plt.show()
这段代码看起来有点多,但每一行都有它的用处。fig, ax = plt.subplots()这是最核心的用法——fig是整个画布,ax是画布上的一个坐标轴。以后你画多子图、双Y轴图都会用到这个模式。
接着看柱状图,适合比较不同类别的数据:
# 各产品线销售额对比
products = ['产品A', '产品B', '产品C', '产品D', '产品E']
revenue = [45000, 38000, 52000, 29000, 61000]
fig, ax = plt.subplots(figsize=(10, 6))
colors = ['#2E86AB', '#A23B72', '#F18F01', '#C73E1D', '#3B1F2B']
bars = ax.bar(products, revenue, color=colors, edgecolor='white', linewidth=1.5)
# 在柱子上方标注数值
for bar, val in zip(bars, revenue):
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1000,
f'{val:,}', ha='center', fontsize=11, fontweight='bold')
ax.set_title('各产品线年度销售额', fontsize=16, fontweight='bold', pad=15)
ax.set_ylabel('销售额(元)', fontsize=12)
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, p: f'{x/1000:.0f}k')) # Y轴用k单位显示
ax.spines['top'].set_visible(False) # 去掉顶部边框
ax.spines['right'].set_visible(False) # 去掉右侧边框
plt.tight_layout()
plt.show()
散点图适合看两个变量之间的关系,比如广告投入和销售额的关系:
np.random.seed(42)
ad_spend = np.random.uniform(1000, 10000, 50) # 广告投入
sales = ad_spend * 3.5 + np.random.normal(0, 2000, 50) # 销售额,跟广告投入正相关
fig, ax = plt.subplots(figsize=(10, 6))
scatter = ax.scatter(ad_spend, sales, c=sales, cmap='viridis', s=80, alpha=0.7, edgecolors='white')
# 添加趋势线
z = np.polyfit(ad_spend, sales, 1)
p = np.poly1d(z)
x_line = np.linspace(min(ad_spend), max(ad_spend), 100)
ax.plot(x_line, p(x_line), "r--", linewidth=2, label=f'趋势线 (斜率={z[0]:.2f})')
ax.set_title('广告投入与销售额关系分析', fontsize=16, fontweight='bold', pad=15)
ax.set_xlabel('广告投入(元)', fontsize=12)
ax.set_ylabel('销售额(元)', fontsize=12)
ax.legend(fontsize=11)
cbar = plt.colorbar(scatter, ax=ax)
cbar.set_label('销售额', fontsize=10)
plt.tight_layout()
plt.show()
这个图里有几个高级技巧:用sales给散点着色(颜色越深销售额越高),添加了趋势线和斜率标注,还加了colorbar。这些在Excel里实现起来非常麻烦,matplotlib轻松搞定。
饼图适合看占比,但要注意别用太多切片,最好不超过6个:
# 市场份额分布
categories = ['本公司', '竞争对手A', '竞争对手B', '竞争对手C', '其他']
shares = [35, 25, 18, 12, 10]
colors = ['#2E86AB', '#A23B72', '#F18F01', '#C73E1D', '#95C623']
explode = (0.05, 0, 0, 0, 0) # 把第一块稍微炸开,突出重点
fig, ax = plt.subplots(figsize=(9, 9))
wedges, texts, autotexts = ax.pie(shares, explode=explode, labels=categories, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=90,
textprops={'fontsize': 12})
ax.set_title('市场份额分布', fontsize=16, fontweight='bold', pad=20)
# 美化百分比数字
for autotext in autotexts:
autotext.set_fontsize(11)
autotext.set_fontweight('bold')
plt.tight_layout()
plt.show()
把pandas和matplotlib结合起来
其实最强大的用法,是让pandas和matplotlib无缝协作。pandas的DataFrame自带绘图功能,一行代码就能出图:
# 用pandas自带的plot功能
monthly_sales = df.groupby('月份')['销售额'].sum()
monthly_sales.plot(kind='bar', figsize=(12, 6), color='#2E86AB', edgecolor='white')
plt.title('月度销售额', fontsize=16, fontweight='bold')
plt.ylabel('销售额', fontsize=12)
plt.xlabel('')
plt.tight_layout()
plt.show()
但这个功能比较基础,想要更精细的控制还是得用matplotlib。下面这个完整案例把pandas数据处理和matplotlib绘图串在一起:
# 完整的数据分析+可视化流程
df = pd.read_csv('sales_data.csv')
# 1. 数据清洗
df['日期'] = pd.to_datetime(df['日期'])
df = df.dropna(subset=['销售额', '产品'])
# 2. 数据分析
monthly = df.groupby(df['日期'].dt.to_period('M'))['销售额'].sum().reset_index()
monthly['日期'] = monthly['日期'].astype(str)
product_sales = df.groupby('产品')['销售额'].sum().sort_values(ascending=False).head(8)
# 3. 创建一个包含多个子图的图表
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
fig.suptitle('2024年度销售数据分析报告', fontsize=20, fontweight='bold', y=0.98)
# 子图1:月度趋势
axes[0, 0].plot(monthly['日期'], monthly['销售额'], marker='o', linewidth=2.5,
markersize=8, color='#2E86AB')
axes[0, 0].fill_between(range(len(monthly)), monthly['销售额'], alpha=0.15, color='#2E86AB')
axes[0, 0].set_title('月度销售趋势', fontsize=14, fontweight='bold')
axes[0, 0].set_ylabel('销售额')
axes[0, 0].tick_params(axis='x', rotation=45)
# 子图2:产品占比
colors = plt.cm.Set3(np.linspace(0, 1, len(product_sales)))
axes[0, 1].pie(product_sales.values, labels=product_sales.index, autopct='%1.1f%%',
colors=colors, startangle=90, wedgeprops={'edgecolor': 'white'})
axes[0, 1].set_title('产品销售占比', fontsize=14, fontweight='bold')
# 子图3:地区对比
region_sales = df.groupby('地区')['销售额'].sum().sort_values(ascending=False)
bars = axes[1, 0].barh(region_sales.index, region_sales.values, color='#A23B72')
axes[1, 0].set_title('各地区销售额对比', fontsize=14, fontweight='bold')
axes[1, 0].set_xlabel('销售额')
for bar, val in zip(bars, region_sales.values):
axes[1, 0].text(val + max(region_sales)*0.01, bar.get_y() + bar.get_height()/2,
f'{val:,.0f}', va='center', fontsize=10)
# 子图4:日均销售额分布
axes[1, 1].hist(df['销售额'], bins=30, color='#F18F01', edgecolor='white', alpha=0.8)
axes[1, 1].axvline(df['销售额'].mean(), color='red', linestyle='--', linewidth=2,
label=f'均值: {df["销售额"].mean():,.0f}')
axes[1, 1].axvline(df['销售额'].median(), color='green', linestyle='--', linewidth=2,
label=f'中位数: {df["销售额"].median():,.0f}')
axes[1, 1].set_title('单笔销售额分布', fontsize=14, fontweight='bold')
axes[1, 1].set_xlabel('销售额')
axes[1, 1].legend()
plt.tight_layout(rect=[0, 0, 1, 0.96])
plt.savefig('sales_report.png', dpi=150, bbox_inches='tight')
plt.show()
这个案例展示了真实工作中最常见的场景:数据读取→清洗→分析→多维度可视化。而且最后一行plt.savefig直接把图表保存成高清图片,方便放到报告里。
学习路径建议,别走弯路
我知道你现在可能有点信息过载,这很正常。学新东西刚开始都会有这种感觉。我给你一个实用的学习顺序,按这个来效率最高:
第一周:熟悉pandas的基本操作。不用贪多,把读数据、筛选、分组汇总、合并表这几个功能练熟。随便找个公开数据集(比如Kaggle上随便一个_csv文件),跟着做一遍全流程。
第二周:深入pandas的高级功能。时间序列处理、缺失值策略、数据重塑(pivot/unpivot)、应用自定义函数。这些是日常工作中最高频的需求。
第三周:numpy基础+matplotlib入门。numpy不用花太多时间,掌握数组创建和基本运算就够了。matplotlib从最简单的折线图和柱状图开始,学会怎么加标题、标签、图例、调整样式。
第四周:综合实战。找一个真实的业务场景,比如”电商销售数据分析”,从数据读取到最终出报告,完整走一遍。这个过程最能巩固所学。
推荐几个免费资源:
- 官方文档是最权威的,pandas和matplotlib的文档写得非常清晰
- Kaggle上有大量免费的数据集和-notebook-教程,边看边练效果最好
- 遇到报错别慌,把错误信息复制给搜索引擎,99%的问题别人都遇到过
最后说几句真心话
从Excel转到Python,最难的不是学语法,而是心态上的转变。Excel是”点击操作”,你点一下按钮就出结果;Python是”写代码操作”,你要先把逻辑想清楚再写。刚开始可能会觉得不如Excel快,但只要你坚持写出一两个完整的项目,你会发现Python的强大——同样一份报告,用Excel可能要搞一下午,用Python写好脚本之后,数据更新了只需要改一个文件路径,全部自动重新生成。
更重要的是,Python数据分析不是一个孤立的技能。它会把你跟机器学习、自动化办公、数据可视化甚至AI应用全部打通。今天你在pandas里做的数据清洗,明天可能就是机器学习模型的输入管道。这种技能的延展性,是Excel给不了的。
你现在要做的就是:打开Jupyter Notebook,把上面这些代码复制进去跑一遍,改改数据,换换参数,感受一下它们是怎么工作的。动手才是最好的学习方式,光看是不行的。遇到任何问题随时来问,数据分析这条路,你绝对不是一个人走。
