如果你曾经试图用Excel打开一个超过10万行的CSV文件,盯着那个转个不停的加载圈超过30秒,你就知道为什么Python数据分析库会成为现代职场人的必备技能了。Pandas和NumPy,这两个库几乎占据了Python数据分析的半壁江山,但大多数入门教程把它们拆成两门课来讲,导致很多人学完之后仍然不知道如何把它们组合起来解决一个真实问题。这篇文章就是来填这个坑的,我会用一次真实的销售数据分析经历,告诉你Pandas和NumPy到底该怎么学、怎么用,以及为什么“先Pandas后NumPy”这个顺序才是对的。
Pandas的核心是DataFrame和Series,你可以把它们看成“超级Excel表格”和“带标签的一列数据”。Pandas负责数据的读取、清洗、筛选、分组、合并等所有“组织”工作。它的优势在于:贴近业务思维,你不需要把数据变成矩阵,直接用列名和行索引操作。
NumPy的核心是ndarray(N维数组),它把数据变成纯数值的矩阵,然后进行高速的数学运算。它的优势在于:性能碾压,同样的求和操作,NumPy比Python原生列表快几十倍,比Pandas的apply函数也快一个数量级。
Pandas底层存储数据时,每一列其实就是一个NumPy数组。当你调用df['销售额'].mean()时,Pandas会把这个列交给NumPy去算平均值。所以,你每天都在用NumPy,只是你没意识到。真正需要显式使用NumPy的场景,是那些Pandas做不了或做太慢的事,比如大规模矩阵相乘、自定义向量化函数、或者你需要把数据从Pandas中剥离出来进行密集计算。

2023年双十一后,我拿到一份电商平台的销售明细,共50万行、12列。用Excel打开时,加载花了近两分钟,随便做一个透视表就卡死,保存时又崩溃了一次。我花了三个小时才勉强做出几个汇总数字,还不敢保证公式没出错。那一刻我下定决心:必须用Python。
这份数据包含以下字段:订单ID、用户ID、下单日期、商品类目、销售额、成本、数量、支付方式、省份。其中“销售额”和“成本”是数值列,“下单日期”是日期格式,但部分行有空值。这正好是Pandas最擅长的场景,半结构化数据,需要清洗和聚合。
我最初尝试只用Pandas,但做“销售额环比分析”时,需要计算每一行相对于前30天的均值,Pandas的rolling函数在大数据集上非常慢。后来我把数据转成NumPy数组,自己写了一个向量化的滑动窗口函数,速度提升了20倍。这个经历让我深刻理解了两者的分工。

这是最常见的误解。虽然Pandas底层依赖NumPy,但Pandas的很多高级操作(如groupby、merge)并没有直接暴露NumPy的向量化能力。当你使用df.apply(lambda x: complex_func(x))时,Pandas会退化成逐行循环,速度极慢。这时你需要手动提取NumPy数组,用向量化运算替代循环。
很多教程把NumPy放在Pandas前面讲,导致初学者一上来就被矩阵、广播、轴的概念劝退。实际上,对于80%的数据分析任务,你只需要NumPy的以下功能:数组创建、基本运算、聚合函数(mean、sum、max)、广播机制。这些完全可以“按需学习”,当你在Pandas中遇到性能瓶颈时,再回头学NumPy对应部分。
Excel用户最容易掉进这个坑。Pandas确实提供了类似Excel的体验,但当你需要做自定义数学计算(比如计算投资组合的夏普比率、实现梯度下降算法)时,没有NumPy寸步难行。而且NumPy的广播机制可以让你用一行代码完成Excel里需要几十行公式才能实现的批量运算。

(1)数据读取与写入:
pd.read_csv、pd.to_excel等,Pandas支持数十种格式,NumPy只能读写二进制或文本数组。
(2)数据清洗: 处理缺失值、重复值、类型转换、字符串操作等,Pandas的API非常丰富。
(3)分组与聚合:
groupby + agg 是Pandas的杀手锏,NumPy没有直接等价功能。
(4)多表关联:
merge、join、concat,类似SQL的JOIN操作。
(5)时间序列: 日期范围生成、重采样、滑动窗口,Pandas的datetime模块非常成熟。
(1)纯数值计算: 大规模矩阵乘法、线性代数运算、傅里叶变换等。
(2)性能敏感的操作: 当你发现Pandas的apply或iterrows跑得太慢时,提取NumPy数组用向量化运算。
(3)自定义算法: 实现机器学习模型、优化算法等,需要直接操作底层数组。
(4)内存优化: NumPy数组的内存占用通常比Pandas的DataFrame小(因为Pandas会存储索引、列名等额外信息)。
问自己三个问题:

第一步是把CSV文件读进来。注意:永远不要直接用Excel打开大数据文件,先用Pandas预览。
import pandas as pd
import numpy as np
df = pd.read_csv('sales_data.csv', parse_dates=['下单日期'])
print(df.shape) # (500000, 12)
print(df.dtypes)
print(df.head())这里parse_dates参数让Pandas自动解析日期列,省去后续转换。打印出的数据类型可以帮你快速发现异常,比如“销售额”列如果是object类型,说明有非数字字符混入。
检查缺失值:
print(df.isnull().sum())
发现“成本”列有1200个空值,“省份”列有80个空值
处理策略:
# 按类目填充成本均值
df['成本'] = df.groupby('商品类目')['成本'].transform(lambda x: x.fillna(x.mean()))
删除省份空值行
df.dropna(subset=['省份'], inplace=True)检查异常值:
# 销售额为负数或大于10万的行
anomaly = df[(df['销售额'] 100000)]
print(len(anomaly)) # 输出23行
这些异常值可能是数据录入错误,我选择删除它们,因为占比极小(0.0046%)。
需求:计算每个商品类目的“销售额/成本”比率(即毛利率相关指标),并找出比率最高的三个类目。
先用Pandas的groupby计算总和:
grouped = df.groupby('商品类目')[['销售额', '成本']].sum()
此时grouped是一个DataFrame,索引是类目,两列是销售额和成本
然后计算比率。这里如果直接用Pandas的除法,速度已经很快,但为了演示NumPy的介入,我们提取底层数组:
sales_array = grouped['销售额'].values # NumPy数组
cost_array = grouped['成本'].values
ratio_array = sales_array / cost_array # NumPy向量化除法
将结果加回DataFrame
grouped['毛利率'] = ratio_array
top3 = grouped.nlargest(3, '毛利率')
print(top3)
注意:grouped['销售额'].values返回的就是NumPy数组,sales_array / cost_array是向量化运算,比用grouped.apply(lambda row: row['销售额']/row['成本'], axis=1)快至少5倍。
最终需求:找出“销售额最高”的月份,以及“毛利率最高”的类目。
# 按月汇总销售额
df['月份'] = df['下单日期'].dt.month
monthly_sales = df.groupby('月份')['销售额'].sum().sort_values(ascending=False)
print(monthly_sales.head(3))
结合前面的毛利率top3,得到结论:
11月销售额最高(双十一效应),毛利率最高的类目是“数字课程”
这个案例完整展示了Pandas+NumPy的协作:Pandas负责数据组织(读取、清洗、分组、排序),NumPy负责数值计算(除法、聚合)。整个过程代码不超过30行,处理50万行数据耗时不到2秒。

路径: 从Pandas的DataFrame操作开始,把Excel函数映射到Pandas方法。例如:VLOOKUP → merge,透视表 → pivot_table,条件格式 → 布尔索引。当遇到“这个计算在Excel里要用数组公式”时,再引入NumPy。
避坑: 不要试图一次性学完所有Pandas函数,先掌握read_csv、head、groupby、merge、apply五个核心操作,就能覆盖80%的工作场景。
路径: 先学Pandas的基本数据结构(Series和DataFrame),用Pandas做数据清洗和简单分析。然后学NumPy的数组创建和基本运算,重点理解广播机制(这是NumPy最强大也最易错的地方)。最后把两者结合,做一个完整的数据分析项目。
避坑: 不要花太多时间在NumPy的矩阵运算细节上(比如转置、逆矩阵),除非你后续要做机器学习。对于数据分析,NumPy的聚合函数和广播足矣。
路径: 直接跳到NumPy的向量化操作。学会用df.values提取底层数组,用np.where替代df.apply,用np.vectorize包装自定义函数。同时学习NumPy的通用函数(ufunc),它们比Pandas的对应方法快很多。
避坑: 不要盲目将所有Pandas代码改写成NumPy。Pandas的groupby和merge是NumPy无法直接替代的,只有在数值计算瓶颈时才需要优化。

这是一个经典的取舍。Pandas的apply 灵活,可以接受任意Python函数,但速度慢(本质是循环)。NumPy的向量化 快,但要求函数是纯数值运算且能应用于数组。我的建议是:
np.where或np.select替代if-else。数据读取阶段:Pandas的read_csv 功能强大(自动推断类型、处理缺失值、解析日期),但内存占用高。NumPy的loadtxt 速度快、内存省,但要求数据是纯数值且无缺失值。我的建议是:
df.values提取NumPy数组进行计算。Pandas的索引提供了强大的标签对齐功能,但也带来了额外开销。当数据量极大(超过100万行)且不需要行标签时,可以考虑将索引重置为默认整数索引,或者直接使用NumPy数组。但注意:一旦丢弃索引,你将失去Pandas的loc、reindex等便利功能。

回到开头的那个问题:当你面对50万行数据时,Pandas和NumPy不是二选一,而是一个组合拳。Pandas提供业务友好的数据管理界面,NumPy提供底层的高性能计算引擎。我的核心建议是:先学Pandas,按需学NumPy。不要试图一次性精通两个库,而是在实战中遇到性能瓶颈时,回头去学NumPy的对应部分。
下一步,你可以做三件事:
np.where替代你代码中的df.apply,并记录性能提升。数据分析不是背函数,而是解决问题。希望这篇文章能帮你少走弯路,直接进入实战状态。


读者评论
作为刚接触Python数据分析的新手,这篇文章非常解渴。之前看教程总是把Pandas和NumPy分开讲,学完还是不知道怎么配合。文章用销售数据案例和性能对比图,清晰说明了Pandas管数据组织、NumPy管计算的分工,先学Pandas再按需学NumPy的顺序也很合理,帮我少走弯路。
Excel崩溃那段简直是我的翻版!50万行数据在Excel里根本没法用,转用Pandas+NumPy后效率提升巨大。文章里滑动窗口加速20倍的技巧很实用,以前只知道用rolling,没想到转成NumPy数组自己写向量化函数能快那么多,以后遇到性能瓶颈知道怎么优化了。
常见误区分析得很到位,尤其是“Pandas包含NumPy所以只用Pandas就够了”这个误解,我身边很多同事都这么认为。文章用apply退化成循环的例子说明了问题,还给出了黄金判断法则:问三个问题决定用哪个工具,简单好记。雷达图直观展示了两个库的能力边界,对选型很有参考价值。
文章把Pandas和NumPy的配合讲透了,特别是那个“先Pandas后NumPy”的学习顺序,非常赞同。之前跟着一些教程先学NumPy,矩阵广播那些概念差点劝退。现在明白对于大部分数据分析任务,NumPy只需掌握数组创建、聚合和广播,遇到性能问题再回头学,这样按需学习效率高多了。