CSV数据清洗是数据处理流程中非常基础且重要的环节,很多原始CSV文件会因为采集、存储等原因存在各类问题,使用Python可以快速高效地完成相关预处理工作,核心依赖pandas库的能力即可实现大部分常见操作。
一、读取CSV文件
首先需要使用pandas的read_csv方法读取CSV文件,该方法支持指定编码、分隔符等参数,适配不同格式的CSV文件。
import pandas as pd
# 读取CSV文件,指定编码为utf-8,分隔符为逗号
df = pd.read_csv("test.csv", encoding="utf-8", sep=",")
# 查看前5行数据,确认读取是否正常
print(df.head())
二、处理缺失值
原始CSV中经常会出现空值或者占位符形式的缺失值,需要根据业务场景选择删除或者填充的处理方式。
1. 查看缺失值分布
可以通过isnull方法结合sum统计每一列的缺失值数量。
# 统计每列缺失值数量 missing_count = df.isnull().sum() print(missing_count)
2. 删除缺失值
如果某行或某列的缺失值占比过高,可以直接删除对应数据。
# 删除包含任意缺失值的行 df_drop_row = df.dropna(axis=0, how="any") # 删除缺失值占比超过50%的列 threshold = len(df) * 0.5 df_drop_col = df.dropna(axis=1, thresh=threshold)
3. 填充缺失值
对于缺失值占比较低且业务允许填充的场景,可以用均值、中位数或者固定值填充。
# 用该列均值填充数值型列的缺失值
df["age"].fillna(df["age"].mean(), inplace=True)
# 用固定值填充字符串列的缺失值
df["city"].fillna("未知", inplace=True)
三、去除重复数据
CSV中可能存在完全重复的行,或者部分关键字段重复的数据,需要按需去重。
# 去除完全重复的行,保留第一条 df_unique = df.drop_duplicates(keep="first") # 基于指定列去重,比如根据id列去重 df_unique_id = df.drop_duplicates(subset=["id"], keep="first")
四、规范字段格式
很多CSV的字段格式不符合后续处理要求,比如日期格式错误、字符串有多余空格、数值型字段被存为字符串等,需要统一转换格式。
1. 处理日期字段
# 将字符串类型的日期转为datetime格式 df["create_time"] = pd.to_datetime(df["create_time"], format="%Y-%m-%d")
2. 清理字符串空格
# 去除字符串字段的前后空格
df["name"] = df["name"].str.strip()
# 去除字符串中的所有空格
df["phone"] = df["phone"].str.replace(" ", "", regex=False)
3. 转换数值类型
# 将字符串类型的数值转为int类型,错误值转为NaN df["score"] = pd.to_numeric(df["score"], errors="coerce")
五、过滤异常数据
部分字段可能存在超出合理范围的异常值,比如年龄为负数、分数为负数等,需要根据规则过滤。
# 过滤年龄小于0或者大于120的异常数据 df_normal = df[(df["age"] >= 0) & (df["age"] <= 120)] # 过滤分数为负数的异常数据 df_normal = df_normal[df_normal["score"] >= 0]
六、保存清洗后的数据
完成所有清洗操作之后,将处理后的DataFrame保存为新的CSV文件即可。
# 保存为新的CSV文件,不保留索引列
df_normal.to_csv("cleaned_test.csv", index=False, encoding="utf-8")