在数据分析的世界里,数据清洗就像烹饪前的食材处理——如果食材不新鲜(数据有问题),后续的美味佳肴(分析结果)肯定会大打折扣。而pandas作为Python中最强大的数据处理库,简直是数据清洗的“瑞士军刀”,能帮我们高效搞定各种数据问题。本文就用最简单的方式,带新手一步步掌握数据清洗的核心技巧,让你从此告别“脏数据”困扰!

一、安装与准备:先让工具就位

首先,确保你的电脑里已经安装了pandas(如果没安装,打开命令行输入 pip install pandas 即可)。然后,在Python脚本或Jupyter Notebook中导入pandas库:

import pandas as pd  # 约定俗成用pd作为别名

二、数据导入:从“源头”看数据

数据清洗的第一步是把数据导入到pandas中。最常见的是导入CSV文件,用 pd.read_csv() 就能搞定:

# 假设你有一个名为"sales_data.csv"的文件,直接读取
df = pd.read_csv("sales_data.csv")  

# 但如果没有现成文件,也可以手动创建一个示例DataFrame(方便新手测试)
data = {
    "姓名": ["小明", "小红", "小刚", "小明", "小芳", "小丽", "小强"],
    "年龄": [25, None, 30, 25, 22, 28, 29],  # None表示缺失值
    "出生日期": ["1998-01-15", "1999-03-20", "1995-05-10", "1998-01-15", "2000-08-22", "2000-11-05", "1995-12-18"],
    "收入": [8000, None, 12000, 8000, 5000, None, 15000]  # 收入有缺失值
}
df = pd.DataFrame(data)

小提示:导入后用 df.head() 快速查看前几行数据,用 df.info() 查看数据类型和缺失值情况:

print("数据前5行:")
print(df.head())

print("\n数据基本信息:")
print(df.info())

运行后你会看到数据的大致样子(包含缺失值、重复行、错误数据类型等),这是后续清洗的“靶子”。

三、清洗第一步:处理缺失值(数据“空”了怎么办?)

缺失值是数据清洗中最常见的问题,pandas用 NaNNone 表示。处理方式有两种:删除填充

1. 识别缺失值

df.isnull() 查看哪些位置是空值,df.isnull().sum() 统计每列缺失值数量:

print("各列缺失值数量:")
print(df.isnull().sum())

输出会显示:年龄列1个缺失值,收入列1个缺失值。

2. 删除缺失值(简单粗暴但慎用)

如果缺失值很少,且不影响整体数据,可以用 dropna() 删除含缺失值的行或列:

# 删除所有包含缺失值的行(默认axis=0,即行)
df_drop = df.dropna()  

# 如果想删除列(比如某列全是缺失值),用axis=1
# df_drop = df.dropna(axis=1)  

print("删除缺失值后的行数:", df_drop.shape[0])  # 原来7行,现在应该是6行(小明那行重复了?哦对,后面处理重复值)

3. 填充缺失值(更常用的方法)

根据业务逻辑填充缺失值,比如用均值、中位数,或直接填“未知”:

# 填充数值列(年龄和收入)用均值
age_mean = df["年龄"].mean()  # 计算年龄均值(25+30+25+22+28+29=159,6个有效数据,159/6=26.5)
df["年龄"] = df["年龄"].fillna(age_mean)

# 收入列用中位数(因为收入可能有异常值,均值容易被拉偏)
income_median = df["收入"].median()  # 收入有效数据:8000,12000,8000,5000,15000 → 中位数是8000
df["收入"] = df["收入"].fillna(income_median)

print("填充后的年龄和收入:")
print(df[["年龄", "收入"]])

小提示:如果某列有固定规则(比如“性别”列缺失值填“未知”),可以直接用 df["性别"] = "未知" 填充。

四、清洗第二步:处理重复值(数据“重复”了怎么办?)

重复行会让分析结果失真,比如小明的收入被统计了两次。pandas用 duplicated() 识别重复行,drop_duplicates() 删除重复行。

# 识别重复行(默认所有列都相同才算重复)
print("是否有重复行:", df.duplicated().any())  # 输出True,因为小明的两行数据完全重复

# 删除重复行(保留第一行,默认keep='first')
df_clean = df.drop_duplicates()  

print("删除重复行后的行数:", df_clean.shape[0])  # 原来7行→现在6行(小明重复的那行被删了)

五、清洗第三步:处理异常值(数据“出格”了怎么办?)

异常值是指明显不符合逻辑的数据(比如年龄200岁、收入1000000元)。先通过描述性统计发现异常,再处理。

1. 用描述统计找异常

df.describe() 看数值列的统计信息,比如收入列的最大值、最小值:

print("数值列统计信息:")
print(df_clean.describe())

输出中如果发现收入列有异常大的值(比如15000可能正常,但如果有150000就明显异常),可以用逻辑筛选删除:

# 假设收入超过20000视为异常(根据业务判断)
df_clean = df_clean[df_clean["收入"] <= 20000]  # 小强的15000没问题,所以保留

进阶方法:如果数值范围不明确,也可以用箱线图(df_clean.boxplot(column='收入'))查看异常值,但需要matplotlib支持,新手可以先简单用逻辑筛选。

六、清洗第四步:统一数据类型(格式“乱”了怎么办?)

数据类型错误会导致分析出错(比如日期列是字符串,无法排序)。用 astype()pd.to_datetime() 转换类型:

# 1. 转换出生日期为datetime类型(方便后续提取年份、月份)
df_clean["出生日期"] = pd.to_datetime(df_clean["出生日期"])

# 2. 转换年龄为整数(如果是浮点数12.0,转成12)
df_clean["年龄"] = df_clean["年龄"].astype(int)

print("转换后的数据类型:")
print(df_clean.dtypes)

现在“出生日期”列会显示为日期格式,年龄是整数,数据类型更规范了。

七、总结:新手数据清洗流程

  1. 导入数据:用 pd.read_csv() 读入数据,或手动创建示例DataFrame;
  2. 初步检查df.head() 看数据,df.info() 看类型,df.isnull().sum() 看缺失;
  3. 处理缺失值:删除或用均值/中位数填充;
  4. 处理重复值:用 duplicated() 识别,drop_duplicates() 删除;
  5. 处理异常值:用描述统计或逻辑判断筛选;
  6. 转换数据类型:确保数值型、日期型正确。

最重要的小技巧:多动手!把上面的代码复制到Jupyter Notebook运行,用自己的数据测试,很快就能掌握~ 数据清洗没有固定公式,多练几次就会“火眼金睛”识别问题啦!

下一篇预告:如果数据量很大,pandas如何高效清洗?关注我,下期带你进阶数据清洗!

小夜