在数据分析的世界里,数据清洗就像烹饪前的食材处理——如果食材不新鲜(数据有问题),后续的美味佳肴(分析结果)肯定会大打折扣。而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用 NaN 或 None 表示。处理方式有两种:删除或填充。
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)
现在“出生日期”列会显示为日期格式,年龄是整数,数据类型更规范了。
七、总结:新手数据清洗流程¶
- 导入数据:用
pd.read_csv()读入数据,或手动创建示例DataFrame; - 初步检查:
df.head()看数据,df.info()看类型,df.isnull().sum()看缺失; - 处理缺失值:删除或用均值/中位数填充;
- 处理重复值:用
duplicated()识别,drop_duplicates()删除; - 处理异常值:用描述统计或逻辑判断筛选;
- 转换数据类型:确保数值型、日期型正确。
最重要的小技巧:多动手!把上面的代码复制到Jupyter Notebook运行,用自己的数据测试,很快就能掌握~ 数据清洗没有固定公式,多练几次就会“火眼金睛”识别问题啦!
下一篇预告:如果数据量很大,pandas如何高效清洗?关注我,下期带你进阶数据清洗!