第2章 数据科学核心库入门:NumPy、Pandas、Matplotlib、Seaborn快速上手

做批次质控,你八成离不开这四个库。我刚开始接触质控项目时,还笨笨地用纯Python列表做统计,结果一个500万行的文件跑了半小时。后来换用NumPy和Pandas,几秒搞定。嗯,这里要说的就是这些"兵器"怎么拿。

说白了,这批质控的核心流程就是:读数据 → 清洗/检查 → 算指标 → 出图报告。每个环节对应的库不一样,但也经常混着用。你想想看,如果连这些工具箱的用法都不熟,后面30章会走得特别累。

我的个人习惯:做质控时,我通常先用Pandas读取数据,再转成NumPy做数值运算,最后用Matplotlib或Seaborn画图。四个库像流水线一样串起来。别把它们的边界分得太死,灵活切换才是高手。

2.1 NumPy:数组与数值计算的基石

NumPy 的核心是 ndarray——一个比Python列表快几十倍的多维数组。为什么会这么快?因为底层用C写得,又做了内存连续布局。我在一次质控项目中需要计算10万条样本的均值、方差,用纯Python写了循环,跑了快两分钟;改用NumPy的向量化操作,0.2秒。那一刻我就明白,向量化是NumPy的灵魂。

来看个最常用的例子:读取一批数据后,先做基本统计。

import numpy as np

data = np.array([23.5, 24.1, 22.8, 25.0, 23.9])
print("均值:", np.mean(data))
print("标准差:", np.std(data))
print("最大值:", np.max(data))
print("最小值:", np.min(data))

除了基本统计,NumPy 还提供了线性代数、随机数、傅里叶变换等模块。质控中常用的是 np.percentile 算分位数、np.corrcoef 算相关系数。

我曾经踩过一个坑:用 np.mean() 前忘了检查缺失值。结果数组里有 NaN,均值也跟着变成了 NaN。后来养成习惯,先用 np.isnan() 过滤或直接上 np.nanmean()。

2.2 Pandas:数据框与数据清洗利器

Pandas 是处理表格数据的首选。它提供了类似于Excel的DataFrame,但能做更复杂的分组、合并、透视。我做质控时最常干的活就是:读取CSV、检查异常值、填充或剔除缺失行。

下面是一段典型的读取与预览代码:

import pandas as pd

df = pd.read_csv("batch_results.csv")
print(df.head())           # 看前5行
print(df.info())           # 列类型、非空计数
print(df.describe())       # 数值列的统计摘要

数据清洗是Pandas的强项。举个例子,我们要删除重复行、填充缺失值:

df.drop_duplicates(inplace=True)
df['浓度'].fillna(df['浓度'].median(), inplace=True)   # 用中位数填充
df['批次号'] = df['批次号'].str.strip()                 # 去除空白

我个人特别喜欢 groupby 与 agg 搭配,能快速按批次计算各种质控指标:

stats = df.groupby('批次号').agg(
    均值=('浓度','mean'),
    标准差=('浓度','std'),
    变异系数=('浓度', lambda x: x.std()/x.mean()*100)
)
记住:Pandas 操作数据时尽量用向量化函数,避免逐行遍历。比如 df['col'].isin() 比 apply 快很多。

2.3 Matplotlib:从基础图表到定制化

Matplotlib 是Python可视化界的老大哥。虽然不少人嫌它语法啰嗦,但它能调出任何你想要的图。我画质控图时常用的有折线图、直方图、箱线图。

下面是一个快速出图示例:

import matplotlib.pyplot as plt

# 直方图查看分布
plt.hist(df['浓度'], bins=30, edgecolor='black', alpha=0.7)
plt.xlabel('浓度 (mg/L)')
plt.ylabel('频数')
plt.title('各批次浓度分布')
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()

如果你想在一张图上画多个子图对比不同批次,用 plt.subplots:

fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# 四个子图分别画不同指标
df[df['批次']=='A']['浓度'].hist(ax=axes[0,0])
df[df['批次']=='B']['浓度'].hist(ax=axes[0,1])
df[df['批次']=='A']['pH'].hist(ax=axes[1,0])
df[df['批次']=='B']['pH'].hist(ax=axes[1,1])
plt.tight_layout()
plt.show()
我建议:把 plt.style.use('ggplot') 或 'seaborn-v0_8' 加到文件开头,图会好看不少。另外记得 plt.savefig('chart.png', dpi=150) 来保存报告用的高清图。

2.4 Seaborn:统计可视化更省力

Seaborn 是在 Matplotlib 上封装的统计绘图库。它默认配色好看,而且一行代码就能画出带分布的箱线图、小提琴图、相关热力图。我平时做质控探索性分析时,首选 Seaborn。

比如你想比较不同批次的浓度分布,箱线图加散点能同时显示离群值:

import seaborn as sns

sns.boxplot(x='批次', y='浓度', data=df)
sns.stripplot(x='批次', y='浓度', data=df, color='black', alpha=0.4)
plt.title('Batch-wise Concentration Distribution')
plt.show()

如果数据变量多,sns.pairplot 可以一次看所有变量的两两关系:

sns.pairplot(df[['浓度','pH','温度','粘度']], diag_kind='kde')
plt.show()
注意:Seaborn 的 sns.set_theme() 会覆盖 Matplotlib 的一些设置。如果你后面要用 Matplotlib 做精细调整,建议先设 sns.set_style('whitegrid') 再拿 ax 对象自己调。

知识体系示意图:数据科学核心库协作流程

数据科学核心库协作流程(批质控场景) 数据加载 Pandas read_csv 清洗/检查 Pandas fillna / drop 数值计算 NumPy mean / std 可视化 Matplotlib / Seaborn 质控报告 图表 + 统计摘要 说明 箭头表示数据流方向

四大库对比一览

库名 核心数据类型 主要应用 质控场景示例
NumPy ndarray 数组运算、统计、线性代数 批量计算均值/标准差/变异系数
Pandas DataFrame, Series 数据加载、清洗、分组聚合 读取CSV、去重、填充缺失、按批次汇总
Matplotlib Figure, Axes 基础图表、高度定制化 直方图、趋势折线图、控制图
Seaborn DataFrame驱动的图形 统计可视化、美观默认样式 箱线图比较批次、相关性热力图

上面这张流程图和表格,基本概括了一个批质控项目的数据流动。你先用 Pandas 把数据装进来,用它的清洗方法收拾干净;需要算复杂统计量可以转成 NumPy 数组(或直接用 Pandas 内置的 mean 等方法);最后用 Matplotlib 或 Seaborn 画图,输出报告。我个人很喜欢在同一个 Jupyter notebook 里混着用,前面几行 Pandas,中间几行 NumPy,最后几行画图,非常顺畅。

好了,这一章先让四个库亮相。后面的章节我们会一个一个深入,结合真实的质控数据来练手。你先把这几个基础操作用熟,后面自然得心应手。