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

🎯 今日目标

  • 学会识别和处理缺失数据(NaN)
  • 学会删除/填补缺失值
  • 清理重复数据
  • 修改列类型,准备数据分析

🧼 一、缺失值处理(NaN)

✅ 1. 检查缺失值
python 复制代码
import pandas as pd
df = pd.read_csv("students.csv")

print(df.isnull())        # 每个元素是否为 NaN
print(df.isnull().sum())  # 每列缺失值数量
✅ 2. 删除缺失数据
python 复制代码
df.dropna()            # 删除包含 NaN 的行
df.dropna(axis=1)      # 删除包含 NaN 的列

inplace=True 参数可以就地修改,不返回新对象。

✅ 3. 填充缺失数据
python 复制代码
df.fillna(0)               # 全部填 0
df["成绩"].fillna(df["成绩"].mean())   # 用均值填充
df.fillna(method="ffill")  # 用上一行填
df.fillna(method="bfill")  # 用下一行填

🔁 二、重复值处理

✅ 1. 检测重复数据

python 复制代码
df.duplicated()            # 标记每行是否重复(默认所有列)
df.duplicated(subset=["姓名"])  # 指定列检查

✅ 2. 删除重复数据

python 复制代码
df.drop_duplicates(inplace=True)

🔧 三、数据类型转换

python 复制代码
df["成绩"] = df["成绩"].astype(float)
df["是否及格"] = df["是否及格"].astype(bool)

可以使用 df.dtypes 查看所有列的数据类型。


🧪 今日练习任务

使用以下示例数据,完成清洗操作:

csv 复制代码
姓名,性别,成绩,是否及格
张三,男,88,True
李四,女,,True
王五,男,59,False
张三,男,88,True
赵六,,92,True
田七,女,NaN,

📝 任务:

  1. 加载该 CSV 文件为 DataFrame

  2. 检查每列缺失值数量

  3. 删除性别缺失的行

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

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

  6. 将"成绩"列类型设置为 float,将"是否及格"填补为 False

    python 复制代码
    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}")

    ✅ 示例输出(清洗后)

    python 复制代码
    原始数据:
       姓名   性别    成绩   是否及格
    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
    csv 复制代码
         姓名 性别    成绩 是否及格
    0    张三  男  88.0   True
    1    李四  女  79.7   True
    2    王五  男  59.0  False
    3    田七  女  79.7  False

✍️ 今日总结

  • 掌握了 dropna()、fillna()、drop_duplicates() 等数据清洗方法
  • 学会判断和填补缺失值
  • 理解了数据类型转换在分析前的重要性

题外话

相关推荐
weixin_460443562 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
kobe_OKOK_4 小时前
__getattr__和__getattribute__如何用
python
全栈弄潮儿5 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
长沙三为智能科技5 小时前
家政小程序门店运营模块设计:会员、下单、派单、结算四段链路的落地拆解
python·小程序·内容运营
Cc.Y5 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
Aloudata5 小时前
LookML 语义模型 vs 企业级独立语义层:BI 建模语言能否承担企业语义底座?
数据库·人工智能·数据分析·数据资产·dataagent
启观川5 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸5 小时前
排序算法介绍
python·算法·排序算法
paopaokaka_luck5 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
阿森_dev5 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计