在真实的 AI 与数据科学工程中,数据很少以干净的 NumPy 纯数字矩阵直接呈现。真实数据往往是包含姓名、日期、省份、分类标签与缺失值的异构表格 (Tabular Data)。
NumPy 擅长高密度的纯数字矩阵运算,但面对字符串列、缺失值 NaN 和按列名检索时却力不从心。
这正是 Pandas 登场的时刻!把 Pandas 比作 Python 中的“超级 Excel 引擎”:它不仅能以极高效率读取 GB 级别的 CSV/Excel 文件,还能用极其简洁的代码完成数据清洗、条件筛选、多表关联与分组统计。
一个 pd.DataFrame 相当于附带了额外坐标轴信息的二维表格:
Index (行索引):每行数据的唯一身份标识(如 0, 1, 2... 或时间日期)。Columns (列名/表头):每列数据的语义标签(如 'age', 'price', 'city')。Values (底层的 NumPy 数组):真正存储底层数值、文本与数据的二维矩阵。支持自定义输入 loc/iloc 参数与布尔条件,观察 DataFrame 动态高亮与切片输出
| Index | id | name | age | city | score |
|---|---|---|---|---|---|
| 0 | 1 | Alice | 24 | Beijing | 88 |
| 1 | 2 | Bob | 29 | Shanghai | 92 |
| 2 | 3 | Charlie | 22 | Guangzhou | 79 |
| 3 | 4 | David | 31 | Beijing | 95 |
| 4 | 5 | Eva | 27 | Shenzhen | 84 |
Pandas 建立在两大核心数据结构之上:
pd.Series:一维带索引的序列(类似于附带了行标签的一维数组或单列数据)。pd.DataFrame:二维带行索引和列名的表格(可看作由多个共享相同 Index 的 Series 拼接而成的字典)。在实际数据分析与机器学习预处理中,以下 8 大类 API 是使用频率最高的“基本功”:
| 操作分类 | 导入方法 (Read) | 导出方法 (Write) | 常用关键参数 |
|---|---|---|---|
| CSV / TXT 文件 | pd.read_csv('file.csv') | df.to_csv('out.csv', index=False) | encoding='utf-8', sep=',', header=0 |
| Excel 工作表 | pd.read_excel('file.xlsx') | df.to_excel('out.xlsx') | sheet_name='Sheet1' |
| JSON / API 数据 | pd.read_json('file.json') | df.to_json('out.json') | orient='records' |
| SQL 数据库 | pd.read_sql(query, conn) | df.to_sql('table', conn) | if_exists='replace' |
df.head(n) / df.tail(n):查看前 行或后 行数据(默认 5 行)。df.info():输出数据框内存占用、每列非空值数量 (Non-Null Count) 与数据类型 (dtypes)。df.describe():输出数值列的八项统计汇总(均值、标准差、最小值、四分位数、最大值)。df.shape:返回 (行数, 列数) 元组。df.columns / df.index:分别查看所有列名与行索引。这是初学 Pandas 时最容易混淆的坑点。Pandas 提供了两种精准切片索引器:
df.loc[行标签, 列标签]:基于显式名称/标签 (Label-based) 进行索引。包含起始和结束端点(闭区间 [a, b])。df.iloc[行位置, 列位置]:基于0 开始的整数位置 (Integer Position-based) 进行索引。遵循 Python 切片标准(前闭后开区间 [a, b))。在 Pandas 中使用多个条件组合筛选时,必须遵守以下两条规则:
&,逻辑或使用 |,逻辑非使用 ~(不能使用 Python 原生的 and, or, not)。() 括起来!# 正确写法:年龄 > 25 且 分数 >= 90
high_performers = df[(df['age'] > 25) & (df['score'] >= 90)]
# 成员资格筛选 .isin()
beijing_shanghai = df[df['city'].isin(['Beijing', 'Shanghai'])]
数据缺失在实际 AI 任务中极常见。Pandas 使用 NaN (Not a Number) 表示缺失值:
df.isnull().sum()(统计每列缺失值总数)。df.dropna(subset=['score'])(删除 score 列包含 NaN 的行)。df.fillna({'score': 0})df['age'].fillna(df['age'].mean(), inplace=True)groupby 遵循“拆分 (Split) - 应用 (Apply) - 合并 (Combine)”三步模式:
当需要将多个表格拼接到一起时:
pd.concat([df1, df2], axis=0):简单拼接(axis=0 纵向按行堆叠,axis=1 横向按列拼接)。pd.merge(df1, df2, on='key', how='inner'):类似于 SQL 中的 JOIN 关联(支持 'inner', 'left', 'right', 'outer')。# 按照 user_id 做左连接 (Left Join)
merged_df = pd.merge(user_info, user_orders, on='user_id', how='left')
pd.Series 与 pd.DataFrame 的层次关系及 Index、Columns、Values 物理三要素。read_csv / to_csv 的核心参数,以及 df.info() 和 df.describe() 的诊断方法。loc(显式标签闭区间)与 iloc(整数位置开区间)的索引用法。df[(cond1) & (cond2)] 的括号要求与 isin() 用法。isnull().sum() 查重与 fillna() / dropna() 的缺失值清洗流程。df.groupby().agg() 进行多指标分组统计。df[(df['a'] > 10) & (df['b'] < 5)] 时,各个子条件外面的小括号 () 绝对不能省略?df 有 5 行数据(索引为 0, 1, 2, 3, 4),切片 df.loc[1:3] 与 df.iloc[1:3] 分别会返回几行数据?为什么?df 中 'city' 为 'Beijing' 且 'score' 列非空 (notnull) 的所有样本,并计算其平均年龄。恭喜您完成了 阶段 0:Python 基础与数据分析专项 的学习!您已经掌握了从基础语法、面向对象、NumPy 高维矩阵计算到 Pandas 表格清洗的完整基本功。
下一步我们将正式跨入 阶段 1:机器学习 (Machine Learning),首先学习 Matplotlib 与 Seaborn 数据可视化与 AI 实验工作流!