🎯 今日目標
- 學會識別和處理缺失數據(NaN)
- 學會刪除/填補缺失值
- 清理重復數據
- 修改列類型,準備數據分析
🧼 一、缺失值處理(NaN)
? 1. 檢查缺失值
import pandas as pd
df = pd.read_csv("students.csv")print(df.isnull()) # 每個元素是否為 NaN
print(df.isnull().sum()) # 每列缺失值數量
? 2. 刪除缺失數據
df.dropna() # 刪除包含 NaN 的行
df.dropna(axis=1) # 刪除包含 NaN 的列
inplace=True
參數可以就地修改,不返回新對象。
? 3. 填充缺失數據
df.fillna(0) # 全部填 0
df["成績"].fillna(df["成績"].mean()) # 用均值填充
df.fillna(method="ffill") # 用上一行填
df.fillna(method="bfill") # 用下一行填
🔁 二、重復值處理
? 1. 檢測重復數據
df.duplicated() # 標記每行是否重復(默認所有列)
df.duplicated(subset=["姓名"]) # 指定列檢查
? 2. 刪除重復數據
df.drop_duplicates(inplace=True)
🔧 三、數據類型轉換
df["成績"] = df["成績"].astype(float)
df["是否及格"] = df["是否及格"].astype(bool)
可以使用
df.dtypes
查看所有列的數據類型。
🧪 今日練習任務
使用以下示例數據,完成清洗操作:
姓名,性別,成績,是否及格
張三,男,88,True
李四,女,,True
王五,男,59,False
張三,男,88,True
趙六,,92,True
田七,女,NaN,
📝 任務:
-
加載該 CSV 文件為 DataFrame
-
檢查每列缺失值數量
-
刪除性別缺失的行
-
用“成績”列均值填補成績缺失值
-
刪除重復的行(姓名、成績相同)
-
將“成績”列類型設置為
float
,將“是否及格”填補為False
import pandas as pd import os# 路徑設置 input_path = "./data/students_dirty.csv" output_path = "./data/students_cleaned.csv"# 確保輸出目錄存在 os.makedirs(os.path.dirname(output_path), exist_ok=True)# 加載原始數據 df = pd.read_csv(input_path) print("原始數據:") print(df)# 1. 檢查每列缺失值數量 print("\n缺失值統計:") print(df.isnull().sum())# 2. 刪除性別缺失的行 df = df.dropna(subset=["性別"])# 3. 用“成績”列均值填補缺失值 # 保留整數部分,四舍五入到整數 mean_score = df["成績"].mean().round() df["成績"] = df["成績"].fillna(mean_score)# 4. 刪除重復的行(默認檢查所有列) df = df.drop_duplicates()# 5. 填補“是否及格”空缺值為 False with pd.option_context("future.no_silent_downcasting", True):df = df.fillna(False).infer_objects(copy=False)# 6. 數據類型轉換 df["成績"] = df["成績"].astype(float) df["是否及格"] = df["是否及格"].astype(bool)# 顯示清洗結果 print("\n清洗后的數據:") print(df)# 保存結果 df.to_csv(output_path, index=False, encoding="utf-8") print(f"\n? 清洗后的數據已保存至 {output_path}")
? 示例輸出(清洗后)
原始數據:姓名 性別 成績 是否及格 0 張三 男 88.0 True 1 李四 女 NaN True 2 王五 男 59.0 False 3 張三 男 88.0 True 4 趙六 NaN 92.0 True 5 田七 女 NaN NaN缺失值統計: 姓名 0 性別 1 成績 2 是否及格 1 dtype: int64清洗后的數據:姓名 性別 成績 是否及格 0 張三 男 88.0 True 1 李四 女 78.0 True 2 王五 男 59.0 False 5 田七 女 78.0 False? 清洗后的數據已保存至 ./data/students_cleaned.csv
姓名 性別 成績 是否及格 0 張三 男 88.0 True 1 李四 女 79.7 True 2 王五 男 59.0 False 3 田七 女 79.7 False
?? 今日總結
- 掌握了
dropna()
、fillna()
、drop_duplicates()
等數據清洗方法 - 學會判斷和填補缺失值
- 理解了數據類型轉換在分析前的重要性