Python 数据分析与可视化 Day 2 - 数据清洗基础

发布于:2025-06-24 ⋅ 阅读:(16) ⋅ 点赞:(0)

🎯 今日目标

  • 学会识别和处理缺失数据(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,

📝 任务:

  1. 加载该 CSV 文件为 DataFrame

  2. 检查每列缺失值数量

  3. 删除性别缺失的行

  4. 用“成绩”列均值填补成绩缺失值

  5. 删除重复的行(姓名、成绩相同)

  6. 将“成绩”列类型设置为 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() 等数据清洗方法
  • 学会判断和填补缺失值
  • 理解了数据类型转换在分析前的重要性

题外话

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到