🎯 今日目標
- 掌握 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
?? 今日總結
- 掌握了布爾索引與邏輯運算篩選數據
- 熟悉了多列組合排序操作
- 學會了常用的數據子集提取方法
- 初步接觸了分組聚合分析