4-1 Pandas核心容器与数据读取

🎯 教学目标与重难点…

【三维目标】

  • 📚 知识目标

  • 理解 Pandas 在 NumPy 基础上的扩展优势(引入带标签的维度);

  • 掌握一维 Series 与二维 DataFrame 的底层结构及 Index 索引对象的特性;

  • 掌握使用 pd.read_csv()pd.read_excel() 读取外部数据集的语法与常用参数(encodingsepindex_col);

  • 掌握数据查看与保存函数(head()tail()info()to_csv())。

  • ⚙️ 能力目标

  • 能够熟练从本地读取各种格式(CSV/Excel/TXT)的真实数据集;

  • 能够利用 .shape.dtypes.index.columns 快速核查并诊断数据的结构;

  • 能够区分并熟练提取单列 Series 与多列 DataFrame

  • 💡 素养目标

  • 建立“数据先入库、结构先核查”的数据预处理工程规范意识;

  • 体会 Pandas 在处理异构表格数据时的便利性,激发数据分析的学习兴趣。

【重点与难点】

  • 🟢 教学重点SeriesDataFrame 的逻辑结构与联系;常用数据读取函数(read_csv/read_excel);数据结构的身份证属性(.dtypes.columns.shape)。
  • 🟡 教学难点Index 对象的不可变性与显式/隐式索引区别;文件读取时的编码报错(UnicodeDecodeError)诊断与解决;单列提取后数据类型从 DataFrame 退化为 Series 的空间维度感知。

📌 一、 课程导入(10 分钟)

  1. 真实场景痛点:NumPy 遇到“异构表格”怎么办?
  • 上一章学习的 NumPy 虽然算得快,但要求所有数据必须是同一种纯数字类型(如全 float),且只有无意义的行列序号(0, 1, 2…)。
  • 现实中的数据表格(如学生成绩单、二手房数据)既有文本(姓名、城市),又有数字(年龄、价格),且带有表头(“面积”、“售价”)。
  1. 数据分析神器 Pandas 闪亮登场
  • Pandas = Panel Data(面板数据),底层建立在 NumPy 之上。
  • 核心优势:给数组带上了“行标签(Index)”和“列标签(Columns)”,完美对标 Excel 表格形态。
  • 👨‍🏫 教师活动:展示一张真实的 Excel 学生数据表,对比纯 NumPy 矩阵与 Pandas 表格的视觉差异;用“带标签的超强 Excel”比喻讲解 Pandas 的定位。
  • 🧑‍🎓 学生活动:观察对比,思考如果用 NumPy 存储“姓名+年龄+成绩”会遇到什么类型转换问题,体会 Pandas 引入的必要性。

从现实业务数据“多类型混合、含标题栏”的痛点出发,自然引出 Pandas,帮助学生理解 NumPy 与 Pandas 的分工:NumPy 搞底层矩阵计算,Pandas 搞上层表格数据分析。


📖 二、 解决问题过程(一):数据的“进与出”——读取外部真实数据(30 分钟)

打破纯理论讲造数据的旧套路,直接从读取磁盘上的真实文件开始,让学生第一时间接触真实数据集。

1. 核心读取函数对比

读取函数 常见后缀名 核心注意参数 典型场景
pd.read_csv() .csv, .txt, .data sep (分隔符), encoding (编码) 大数据量、通用文本分隔数据
pd.read_excel() .xlsx, .xls sheet_name (工作表名) 办公软件生成的报表

2. 读取排错三大坑(教师现场示范报错)

  • 坑 1:编码错误 (UnicodeDecodeError)

  • 原因:Windows 中文环境下保存的 CSV 经常是 GBKANSI 编码。

  • 解法:指定参数 encoding='gbk'encoding='utf-8'

  • 坑 2:分隔符不是逗号 (sep)

  • 原因:某些文本文件(如 .txt)使用制表符 \t 或空格分隔。

  • 解法pd.read_csv('data.txt', sep='\t')

  • 坑 3:路径找不到 (FileNotFoundError)

  • 原因:相对路径不正确。

 1import pandas as pd
 2
 3# 1. 读取标准 CSV 文件 (处理中文编码)
 4df_csv = pd.read_csv('student_scores.csv', encoding='gbk')
 5
 6# 2. 读取 Excel 文件
 7df_excel = pd.read_excel('house_prices.xlsx', sheet_name='Sheet1')
 8
 9# 3. 数据写出与保存 (注意: index=False 防止多出一列序号)
10df_csv.to_csv('saved_scores.csv', index=False, encoding='utf-8-sig')
11print("数据读取与保存演示完毕!")
  • 👨‍🏫 教师活动:故意演示读取一个 GBK 编码的 CSV 文件触发报错,引导学生看懂报错信息并加入 encoding='gbk' 解决;演示 to_csv(index=False)index=False 参数的作用。
  • 🧑‍🎓 学生活动:在 Jupyter 中运行教师发放的练习文件,亲自排查一次编码报错,尝试将读取的数据重新导出保存。

将原本放在后面的“数据读取”前置,让后续所有知识点的学习都建立在真实数据表格之上;提前把编码报错等机房高频“绊脚石”解决掉,建立工程排错能力。


💻 三、 解决问题过程(二):探究 Pandas 核心容器与结构(30 分钟)

读取数据后,我们需要核查载入的数据到底是什么结构。

1. 两大数据容器与索引对象

  • Series(一维):带标签的一维同质数组(类似表格中的“单列数据”)。
  • DataFrame(二维):带行标签和列标签的二维异构表格(由多个 Series 共享同一套 Index 组合而成)。
  • Index(索引对象):存储行标签或列标签的容器,具有不可变性(Immutable),确保数据对齐不乱套。
1          列索引 (df.columns)
2              ↓        ↓
3行索引 (df.index) →  [姓名]   [成绩]
4           0       张三     85    ← Series
5           1       李四     92    ← Series

2. 数据的“体检报告”属性与函数

读取数据后,第一时间调用以下属性和函数进行概览:

  • **df.head(n) / df.tail(n)**:查看前/后 n 行数据(默认 5 行)。
  • df.shape:查看数据形状 (行数, 列数)
  • df.dtypes:查看每一列的数据类型(注:object 代表字符串/混合类型)。
  • df.info():一键查看总行数、列名、非空值数量及内存占用(极其重要!)。
 1import pandas as pd
 2
 3# 载入数据进行体检
 4df = pd.read_csv('student_scores.csv', encoding='gbk')
 5
 6# 1. 查看前 3 行
 7print("--- 前 3 行数据 ---")
 8print(df.head(3))
 9
10# 2. 核查形状与列数据类型
11print("\n数据形状 (行, 列):", df.shape)
12print("\n各列数据类型:\n", df.dtypes)
13
14# 3. 提取单列 (退化为 Series)
15name_series = df['姓名']
16print("\n提取'姓名'列的类型:", type(name_series)) # <class 'pandas.core.series.Series'>
  • 👨‍🏫 教师活动:结合动画PPT和板书,画出 DataFrame 与 Series 的立体结构关系;带领学生运行 df.info(),逐行解读返回的信息。
  • 🧑‍🎓 学生活动:跟练代码,尝试提取表格中的不同列,观察提取单列与提取多列时返回的数据类型(Series vs DataFrame)有何不同。

通过“体检”这一直观概念,让学生掌握查看数据全貌的标准动作;厘清 Series 与 DataFrame 的包含关系,打牢数据提取的维度认知。


✍️ 四、 解决问题过程(三):充分课堂练习与巩固(20 分钟)

📝 任务一:读取 txt 报表与诊断体检…

背景与题目: 教师发放了一个用制表符 \t 分隔的文本数据文件 data_test.txt(编码为 GBK)。请编写 Python 代码完成以下任务:

  • 使用 pd.read_csv() 成功载入数据,赋值给变量 df_test
  • 打印该数据集的行数与列数
  • 使用 .info() 方法检查数据中是否存在缺失值,并找出哪一列的数据类型是 object
  • 提取数据中的前 5 行并打印输出。
🔍 查看参考代码与解析…
 1import pandas as pd
 2
 3# 1. 使用正确的 sep 与 encoding 参数读取文件
 4df_test = pd.read_csv('data_test.txt', sep='\t', encoding='gbk')
 5
 6# 2. 打印形状
 7print("数据集行数与列数:", df_test.shape)
 8
 9# 3. 打印整体 info 信息
10print("\n--- 数据集体检报告 ---")
11df_test.info()
12
13# 4. 打印前 5 行
14print("\n--- 前 5 行数据 ---")
15print(df_test.head(5))

📝 任务二:二手房数据集读取、列提取与重新导出…

背景与题目: 目录下有一个二手房数据文件 house_data.csv。请编写代码完成以下链式实操:

  • 读取 house_data.csv,查看并打印所有列名(.columns)。
  • 单独提取“售价”这一列,赋值给变量 price_s,并打印验证其数据类型是否为 Series
  • 同时提取“面积”和“售价”这两列,组成一个新的 DataFrame,赋值给 df_sub
  • df_sub 保存导出为新的 CSV 文件 house_sub.csv,要求不写入自动生成的行序号index=False),编码使用 utf-8-sig
🔍 查看参考代码与解析…
 1import pandas as pd
 2
 3# 1. 读取 CSV 文件
 4df_house = pd.read_csv('house_data.csv', encoding='gbk')
 5print("所有列名:", df_house.columns)
 6
 7# 2. 提取单列
 8price_s = df_house['售价']
 9print("\n单列类型:", type(price_s)) # <class 'pandas.core.series.Series'>
10
11# 3. 提取多列 (注意使用双层方括号 [['列1', '列2']])
12df_sub = df_house[['面积', '售价']]
13print("\n多列子表格前 3 行:\n", df_sub.head(3))
14
15# 4. 导出保存 (不带序号)
16df_sub.to_csv('house_sub.csv', index=False, encoding='utf-8-sig')
17print("\n文件已成功导出为 house_sub.csv!")

📝 五、 课堂小结(5 分钟)

flowchart LR
    root["📊 4-1 Pandas 核心容器与数据读取"]

    subgraph C1["📥 1. 数据进与出 (IO)"]
        direction TB
        A1["pd.read_csv(sep, encoding)"]
        A2["pd.read_excel(sheet_name)"]
        A3["to_csv(index=False) 保存"]
    end

    subgraph C2["📦 2. 核心数据容器"]
        direction TB
        B1["Series: 带索引一维数组"]
        B2["DataFrame: 带行列标签二维表格"]
        B3["Index: 不可变标签容器"]
    end

    subgraph C3["🔍 3. 结构体检属性"]
        direction TB
        C1_node["df.shape / df.dtypes"]
        C2_node["df.head() / df.tail()"]
        C3_node["df.info() (全面诊断)"]
    end

    root --> C1
    root --> C2
    root --> C3

    %% 自定义主题色彩美化
    style root fill:#4b6cb7,stroke:#253b6e,color:#fff,stroke-width:2px,rx:8px,ry:8px
    style C1 fill:#e3f2fd,stroke:#2196f3,stroke-width:1px
    style C2 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
    style C3 fill:#e8f5e9,stroke:#4caf50,stroke-width:1px

✏️ 随堂检测与互动练习

点击展开:随堂测试题(带解析)

一、 单选题

  1. 使用 pd.read_csv() 读取包含中文的 CSV 文件时,如果报 UnicodeDecodeError 错误,最应该调整的参数是?
  • A. sep
  • B. encoding
  • C. header
  • D. index_col
【答案】

【解析】BUnicodeDecodeError 代表编码格式不匹配,可以通过指定 encoding='gbk'encoding='utf-8' 来解决。

  1. 在 Pandas 中,从一个二维 DataFrame 中使用 df['单列名'] 提取出来的对象,其数据类型是?
  • A. numpy.ndarray
  • B. pandas.DataFrame
  • C. pandas.Series
  • D. python.list
【答案】

【解析】C。从二维 DataFrame 中提取单独的一列,数据结构会降维退化为带索引的一维 Series

  1. 保存 DataFrame 到 CSV 文件时,如果不希望把 Pandas 自动生成的行索引数字(0, 1, 2…)写入文件中,应该设置哪个参数?
  • A. header=None
  • B. index=False
  • C. sep=' '
  • D. mode='a'
【答案】

【解析】Bindex=False 可以在保存导出文件时过滤掉默认的自动自增行序号。

二、 简答与思考题

题目:在数据预处理中,为什么我们在导入数据后要优先运行 df.info() 而不是直接开始计算?df.info() 能告诉我们哪些重要信息?

【答案】
  1. 预防盲目计算报错:如果数据列中存在缺失值或数值被误识别为文本(object),直接计算会触发报错。
  2. 核心诊断信息df.info() 可以一次性查看数据的总行数、总列数、每一列的非空值(Non-Null)数量(用于判断是否有缺失值)、列的数据类型(dtypes)以及占用内存大小。

📮 六、 课后作业与拓展

📮 课后作业…
  1. 基础巩固(读取与属性核查)
  • 寻找一个本地或网上的 .csv 文件,尝试用 Pandas 读取它。
  • 分别打印输出其 .shape.columns.dtypes
  • 使用 .head(10) 查看前 10 行数据。
  1. 数据提取与导向实操
  • 提取该数据集中的某两列数据,组成一个新的 DataFrame。
  • 检查新 DataFrame 的形状(.shape)。
  • 将该新 DataFrame 导出保存为 exported_data.csv,要求不包含行索引序号。
  1. 预习任务
  • 预习下一个章节(4.2 DataFrame 基本操作),思考:如果我想在 Pandas 表格中精确定位“第 3 行第 5 列”的数据,或者挑选出“售价 > 300 万的所有房子”,应该使用什么语法?

📋 七、 板书设计

🛠️ 板书设计…
 14-1 Pandas 核心数据容器与数据读取
 2
 3一、 核心容器与结构
 4  - Series: 带索引的一维数组 (类似表格单列)
 5  - DataFrame: 带行/列标签的二维表格 (由多个 Series 组成)
 6  - Index: 不可变的行/列标签对象
 7
 8二、 数据读取与保存 (重点!)
 9  - 读取 CSV: pd.read_csv('文件名.csv', encoding='gbk', sep=',')
10  - 读取 Excel: pd.read_excel('文件名.xlsx', sheet_name='Sheet1')
11  - 保存 CSV: df.to_csv('新文件名.csv', index=False, encoding='utf-8-sig')
12  
13  常见踩坑排查:
14  1. UnicodeDecodeError  -> 加 encoding='gbk'
15  2. FileNotFoundError   -> 检查文件路径
16  3. 分隔符不对         -> 调整 sep='\t'
17
18三、 数据体检“四大件”
19  1. df.head(n) / df.tail(n)  : 查看前/后 n 行
20  2. df.shape                 : 查看 (行数, 列数)
21  3. df.dtypes                : 查看各列数据类型
22  4. df.info()                : 综合体检 (缺失值、内存)