Python 从零开始 · 第 12 课:numpy 与 pandas 入门
前面 11 课,我们玩的都是"一个数、一行字、一个列表"这种小数据。但真实世界的数据,动辄几万行、几十列——比如一张销售表、一份股票行情、一坨传感器读数。这时候光靠 for 循环慢慢算,又慢又累。
这一课,我们请出数据科学的两大镇宅神器:
- numpy:用"数组"批量做数值运算,快得像作弊。
- pandas:用"DataFrame"(表格)管理、清洗、分析数据,像 Excel 一样顺手,但强一万倍。
学完这一课,你就拿到了进「机器学习」大门的门票——几乎所有 ML 代码都离不开它俩。
一、先装库:pip install
第 8 课我们学过 pip,现在派上用场。命令行里敲:
pip install numpy pandas装好后,代码里导入。习惯上给它们起简称:
import numpy as np # numpy 简称 np
import pandas as pd # pandas 简称 pd二、numpy 数组:批量运算的发动机
numpy 的核心是 ndarray(n 维数组)。它和 Python 列表长得像,但有本质区别:数组里的每个元素类型相同,且运算是对整个数组一次性完成的。
2.1 创建数组
import numpy as np
a = np.array([1, 2, 3, 4, 5]) # 一维数组
print(a) # [1 2 3 4 5]
print(a.dtype) # int64,数组里元素的类型
m = np.array([[1, 2], [3, 4]]) # 二维数组(矩阵)
print(m.shape) # (2, 2),2 行 2 列常用快捷创建:
np.zeros(3) # [0. 0. 0.]
np.ones(3) # [1. 1. 1.]
np.arange(5) # [0 1 2 3 4],像 range
np.arange(0, 10, 2) # [0 2 4 6 8]2.2 向量化运算:告别 for 循环
这是 numpy 最爽的地方——整个数组一起算,不用写 for:
a = np.array([1, 2, 3, 4])
print(a + 10) # [11 12 13 14]
print(a * 2) # [2 4 6 8]
print(a ** 2) # [1 4 9 16],每个元素平方
print(a > 2) # [False False True True]对比一下,用纯 Python 写 a * 2 得写 [x*2 for x in a]。numpy 一行搞定,而且底层是 C 实现,几百万个数据也是瞬间算完。
2.3 统计函数
a = np.array([1, 2, 3, 4, 5])
a.sum() # 15
a.mean() # 3.0,平均值
a.max() # 5
a.min() # 1
a.std() # 标准差,衡量数据"散不散"2.4 索引和切片
和列表几乎一样,多维就多一个维度:
a = np.array([10, 20, 30, 40, 50])
print(a[0]) # 10
print(a[1:4]) # [20 30 40]
m = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(m[1, 2]) # 6,第 2 行第 3 列
print(m[0]) # [1 2 3],第 1 行
print(m[:, 0]) # [1 4 7],第 1 列(冒号表示"所有行")三、pandas DataFrame:内存里的 Excel
pandas 的核心是 DataFrame,你可以把它理解成一张有行索引、有列名的表格,和 Excel 表几乎一一对应。
3.1 创建 DataFrame
最常用的是拿一个"字典"建表——字典的 key 是列名,value 是该列的数据:
import pandas as pd
data = {
"姓名": ["张三", "李四", "王五"],
"年龄": [25, 30, 28],
"城市": ["北京", "上海", "深圳"],
}
df = pd.DataFrame(data)
print(df)输出:
姓名 年龄 城市
0 张三 25 北京
1 李四 30 上海
2 王五 28 深圳最左边那列 0 1 2 是行索引,默认从 0 开始。
3.2 查看数据
df.head(2) # 看前 2 行
df.shape # (3, 3),3 行 3 列
df.columns # 列名列表
df["年龄"] # 取"年龄"这一列,返回一个 Series(一列数据)
df.info() # 每列的类型、有没有缺失值3.3 筛选行
df[df["年龄"] > 26] # 选出年龄大于 26 的行
df[df["城市"] == "上海"] # 选出城市是上海的行df["年龄"] > 26 会生成一串 [False, True, True] 这样的布尔值,用 df[...] 一包,就只留下 True 的行——这招叫布尔索引,是 pandas 的精华。
3.4 排序与统计
df.sort_values("年龄") # 按年龄升序排
df.sort_values("年龄", ascending=False) # 降序
df["年龄"].mean() # 平均年龄
df["年龄"].describe() # 一网打尽:个数、均值、最大最小、四分位四、数据清洗:把"脏数据"洗干净
真实数据永远不干净:有缺失值、有重复、有异常。pandas 就是干这个的。
4.1 处理缺失值(NaN)
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五"],
"年龄": [25, None, 28], # 李四的年龄丢了
})
df.isnull() # 每一格是不是缺失,True/False
df.dropna() # 删掉有缺失值的行
df.fillna(0) # 用 0 填缺失值
df["年龄"].fillna(df["年龄"].mean()) # 用平均值填(更常见)4.2 去重
df.drop_duplicates() # 删掉完全重复的行
df.drop_duplicates(subset=["姓名"]) # 只按"姓名"去重4.3 重命名、增删列
df.rename(columns={"年龄": "age"}) # 改列名
df["新列"] = df["年龄"] * 2 # 新增一列
df.drop("城市", axis=1) # 删掉"城市"列4.4 读写文件:和 Excel/CSV 打交道
df.to_csv("data.csv", index=False) # 存成 CSV(index=False 别把行号存进去)
df = pd.read_csv("data.csv") # 读回来
df.to_excel("data.xlsx", index=False) # 存成 Excel读 Excel 需要额外装 pip install openpyxl。CSV 是纯文本、哪里都能开,日常更推荐。五、numpy + pandas 打配合
两者常常混着用:pandas 管表格,numpy 管数值:
import numpy as np
import pandas as pd
df = pd.DataFrame({
"分数": [85, 92, 78, 66, 90],
})
df["等级"] = np.where(df["分数"] >= 80, "优秀", "加油") # numpy 的批量判断
print(df)输出:
分数 等级
0 85 优秀
1 92 优秀
2 78 加油
3 66 加油
4 90 优秀np.where(条件, A, B) 就是"满足条件填 A,否则填 B"的批量版。
六、动手时间 🎯
实验 1:用 numpy 算一组数据的均值方差
import numpy as np
scores = np.array([85, 92, 78, 66, 90, 88, 74])
print("平均分", scores.mean())
print("最高分", scores.max())
print("标准差", round(scores.std(), 2))实验 2:建一张成绩表并清洗
import pandas as pd
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五", "李四", None],
"分数": [85, 92, None, 92, 70],
})
df = df.drop_duplicates(subset=["姓名"]) # 李四重复了,去重
df = df.dropna(subset=["姓名"]) # 删掉姓名为空的
df["分数"] = df["分数"].fillna(df["分数"].mean()) # 缺失分数填平均
print(df.sort_values("分数", ascending=False))实验 3:读 CSV 快速出报告
import pandas as pd
df = pd.read_csv("data.csv") # 换成你自己的 CSV 路径
print(df.shape) # 多少行多少列
print(df.describe()) # 数值列的统计摘要七、课后练习
- 用 numpy 创建
[0, 1, 4, 9, 16, 25](提示:平方 + arange)。 - 建一张包含"商品、价格、销量"的 DataFrame,加一列
销售额 = 价格 * 销量,按销售额降序排。 - 给自己造的 CSV 里故意留几个空值,用
fillna补齐,再to_csv存回。 - 用
np.where给一列成绩批量打"及格/不及格"标签。
下一课,我们让程序联网——用 requests 调 API,把网上的数据抓进 Python。这是后面「AI Agent 调工具」的直接前奏。
八、小结
- numpy 用数组做批量运算,pandas 用 DataFrame 当"内存里的 Excel"。
- 数据到手先摸清底细:
describe()、isna()看一遍,再dropna/fillna清洗。 np.where一行批量打标签,to_csv存回去——数据清洗就是这几步。