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() 等数据清洗方法
  • 学会判断和填补缺失值
  • 理解了数据类型转换在分析前的重要性

题外话

相关推荐
wjs202410 分钟前
DOM CDATA
开发语言
Tingjct11 分钟前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
2401_8321319513 分钟前
Python单元测试(unittest)实战指南
jvm·数据库·python
猷咪38 分钟前
C++基础
开发语言·c++
IT·小灰灰39 分钟前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧41 分钟前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q41 分钟前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳042 分钟前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾42 分钟前
php 对接deepseek
android·开发语言·php
vx_BS813301 小时前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计