前面 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())               # 数值列的统计摘要

七、课后练习

  1. 用 numpy 创建 [0, 1, 4, 9, 16, 25](提示:平方 + arange)。
  2. 建一张包含"商品、价格、销量"的 DataFrame,加一列 销售额 = 价格 * 销量,按销售额降序排。
  3. 给自己造的 CSV 里故意留几个空值,用 fillna 补齐,再 to_csv 存回。
  4. np.where 给一列成绩批量打"及格/不及格"标签。
下一课,我们让程序联网——用 requests 调 API,把网上的数据抓进 Python。这是后面「AI Agent 调工具」的直接前奏。

八、小结

  1. numpy 用数组做批量运算,pandas 用 DataFrame 当"内存里的 Excel"。
  2. 数据到手先摸清底细:describe()isna() 看一遍,再 dropna / fillna 清洗。
  3. np.where 一行批量打标签,to_csv 存回去——数据清洗就是这几步。

标签: none

添加新评论