Python 数据分析与可视化 Day 3 - Pandas 数据筛选与排序操作
🎯 今日目标
- 掌握 DataFrame 的条件筛选(布尔索引)
- 学会多条件筛选、逻辑运算
- 熟练使用排序(
sort_values
)提升数据组织力 - 结合列选择进行数据提取分析
🧪 一、列选择与基本筛选
✅ 选择单列 / 多列
df["成绩"] # 返回 Series
df[["姓名", "成绩"]] # 返回新的 DataFrame
✅ 条件筛选(布尔索引)
# 筛选出成绩大于 80 的学生
df[df["成绩"] > 80]# 获取性别为“女”的学生
df[df["性别"] == "女"]
✅ 多条件筛选(逻辑运算符)
# 成绩大于 80 且是男生
df[(df["成绩"] > 80) & (df["性别"] == "男")]# 成绩不及格 或 未填写是否及格
df[(df["成绩"] < 60) | (df["是否及格"] == False)]
⚠️ 注意:逻辑运算使用
&
、|
、~
,并加上括号!
🔢 二、数据排序
✅ 按单列排序
df.sort_values("成绩") # 升序
df.sort_values("成绩", ascending=False) # 降序
✅ 按多个字段排序
df.sort_values(["是否及格", "成绩"], ascending=[True, False])
🔍 三、列选择 + 排序综合练习
df[df["性别"] == "女"][["姓名", "成绩"]].sort_values("成绩", ascending=False)
🧪 今日练习任务
使用前两天处理好的 students_cleaned.csv
文件,完成以下操作:
📝 练习列表
-
筛选出成绩大于等于 80 的学生
-
筛选出成绩不及格的男生
-
按成绩从高到低排序,并只显示“姓名”和“成绩”
-
统计男女生人数(使用
value_counts
) -
按性别分组后,计算各组平均成绩(使用
groupby
)import pandas as pd import os# 加载数据文件路径 input_path = "data/students_cleaned.csv"if not os.path.exists(input_path):raise FileNotFoundError("❌ 找不到文件:data/students_cleaned.csv。请先运行前两天的清洗脚本。")# 加载 DataFrame df = pd.read_csv(input_path) print("📊 数据加载成功:") print(df.head())# 1. 筛选出成绩 ≥ 80 的学生 print("\n🎯 成绩 ≥ 80 的学生:") print(df[df["成绩"] >= 80])# 2. 筛选出成绩不及格的男生 print("\n🎯 成绩不及格的男生:") condition = (df["成绩"] < 60) & (df["性别"] == "男") print(df[condition])# 3. 按成绩从高到低排序,显示“姓名”和“成绩” print("\n🎯 按成绩排序(降序)显示姓名和成绩:") sorted_df = df.sort_values("成绩", ascending=False)[["姓名", "成绩"]] print(sorted_df)# 4. 统计性别分布 print("\n🎯 男女生人数统计:") print(df["性别"].value_counts())# 5. 按性别分组,统计平均成绩 print("\n🎯 按性别分组的平均成绩:") print(df.groupby("性别")["成绩"].mean())
结果输出:
📊 数据加载成功:姓名 性别 成绩 是否及格 0 张三 男 88.0 True 1 李四 女 78.0 True 2 王五 男 59.0 False 3 田七 女 78.0 False🎯 成绩 ≥ 80 的学生:姓名 性别 成绩 是否及格 0 张三 男 88.0 True🎯 成绩不及格的男生:姓名 性别 成绩 是否及格 2 王五 男 59.0 False🎯 按成绩排序(降序)显示姓名和成绩:姓名 成绩 0 张三 88.0 1 李四 78.0 3 田七 78.0 2 王五 59.0🎯 男女生人数统计: 性别 男 2 女 2 Name: count, dtype: int64🎯 按性别分组的平均成绩: 性别 女 78.0 男 73.5 Name: 成绩, dtype: float64
✍️ 今日总结
- 掌握了布尔索引与逻辑运算筛选数据
- 熟悉了多列组合排序操作
- 学会了常用的数据子集提取方法
- 初步接触了分组聚合分析