4-3 DataFrame高级分析与特征提取
📌 一、 课程导入(10 分钟)
- 真实业务需求:除了清洗数据,我们如何从表格中挖掘规律?
- 经过前面几节课的学习,我们已经能把表格洗得很干净。但老板或业务部门经常问:
- “不同城市的平均房价和最高房价是多少?”
- “不同性别的学生在各科目的成绩表现有什么差异?”
- “用户更喜欢在周末下单还是工作下单?交易时间里蕴含着什么特征?”
- 从“表格管理”升维到“数据挖掘与高级特征提取”
- 本节课将掌握 Pandas 的两大终极杀招:分组透视(分组统计) 与 特殊数据类型(时间/文本)的衍生特征提取。
- 👨🏫 教师活动:展示一张包含“成交时间(如 2026-06-18 14:30:00)”和“用户地址”的电商订单表,引导学生思考如何把一串时间字符串变成机器学习能看懂的“季度”、“月份”或“是否周末”。
- 🧑🎓 学生活动:积极思考并回答,体会到直接拿原始时间字符串无法计算,必须进行高阶类型转换与特征提取。
从业务统计与特征工程的实际需求出发,引入分组聚合与特殊类型处理,帮助学生完成从“数据操作者”到“数据挖掘者”的思维转变。
📖 二、 解决问题过程(一):数据统计分析与分组聚合(30 分钟)
1. 基础描述性统计
df.describe():一键输出数值列的计数、均值、标准差、极值与四分位数。df['列名'].value_counts():快速统计离散分类变量的频数(如各城市房源数量)。
2. 核心机制:groupby() 分组运算
遵循 Split-Apply-Combine(拆分-应用-合并) 三步曲:
- 拆分:按指定列(如“城市”)将数据拆分为多个子组;
- 应用:对每个子组独立应用聚合函数(如
mean()、sum()、count()); - 合并:将结果重新组合成一个全新的 DataFrame。
踩坑提醒:
groupby聚合后,分组列会默认变成“行索引”。一定要加上.reset_index()将其重新还原为标准列,方便后续切片或喂给模型!
3. 数据透视表:pivot_table()
比 Excel 透视表更强大,适合多维交叉汇总:
- 语法:
pd.pivot_table(df, values='统计指标列', index='行分组列', columns='列分组列', aggfunc='mean')
- 👨🏫 教师活动:板书画出
groupby的 Split-Apply-Combine 拆分合并流程图,重点强调.reset_index()的重要性;对比groupby与pivot_table的适用场景。 - 🧑🎓 学生活动:跟练代码,尝试更改聚合函数为
max或sum,观察分组汇总结果的变化。
分组与透视是 Pandas 分析的核心,通过图解拆分合并过程,帮助学生建立明确的维度聚合概念,避免因索引嵌套导致后续代码卡壳。
💻 三、 解决问题过程(二):特殊数据类型提取(时间序列、文本与 Category)(30 分钟)
在真实数据集中,日期时间和文本是提取强特征的“矿山”。
1. 时间序列处理(datetime)
原始日期通常是字符串(如 '2026-06-18'),必须转换为 datetime64 类型,才能使用 .dt 访问器提取特征:
- 转换:
df['时间列'] = pd.to_datetime(df['时间列']) - 特征提取:
- 年/月/日:
.dt.year/.dt.month/.dt.day - 星期几:
.dt.dayofweek(0 代表周一,6 代表周日) - 生成衍生特征:
df['是否周末'] = (df['时间列'].dt.dayofweek >= 5).astype(int)
2. 文本字符串向量化操作(.str)
针对字符串列,使用 .str 访问器 进行批量处理:
- 包含判断(用于衍生特征):
df['描述'].str.contains('精装修')(返回 True/False) - 字符串切分:
df['地址'].str.split('-', expand=True)(将地址切分为多列)
3. 分类数据类型(category)
将高重复性的字符串列(如“性别”、“省份”)转换为 category 类型:
- 优势:大幅降低内存占用,加快
groupby运算速度; - 转换:
df['城市'] = df['城市'].astype('category')
- 👨🏫 教师活动:演示将字符串转为
datetime后,如何用一行代码.dt.dayofweek >= 5衍生出“是否周末”的 0/1 特征;展示.info()中内存消耗变化,证明category的优化威力。 - 🧑🎓 学生活动:在 Jupyter 中运行代码,尝试用
.str.contains()提取其他文本关键词,并打印提取出的特征矩阵。
直接对标机器学习特征工程要求,把看似枯燥的“类型转换”转化为“如何从时间与文本中挖掘模型特征”,极大提升学生的实战兴趣。
✍️ 四、 解决问题过程(三):充分课堂练习与巩固(20 分钟)
📝 五、 课堂小结(5 分钟)
flowchart LR
root["📊 4-3 高级分析与特征提取"]
subgraph C1["📈 1. 分组与透视"]
direction TB
A1["groupby(): 拆分-应用-合并"]
A2["关键操作: .reset_index() 平铺"]
A3["pivot_table(): 交叉汇总透视表"]
end
subgraph C2["⏰ 2. 时间特征提取"]
direction TB
B1["pd.to_datetime(): 类型转换"]
B2[".dt 访问器: year/month/day"]
B3["衍生特征: .dt.dayofweek (是否周末)"]
end
subgraph C3["🔤 3. 文本与内存优化"]
direction TB
C1_node[".str 访问器: .str.contains()"]
C2_node[".str.split(): 字符串切分"]
C3_node["astype('category'): 内存优化"]
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