数据清洗是数据分析过程中至关重要的一环,也是初学者最容易忽视的步骤。本文将详细介绍如何使用Pandas进行数据清洗,涵盖空值处理、日期格式修正、错误数据识别和重复数据删除四大核心内容。
1. Pandas 清洗空值
空值是数据集中最常见的问题之一,Pandas提供了多种处理空值的方法。
1.1 检测空值
import pandas as pd# 创建示例DataFrame
data = {'姓名': ['张三', '李四', None, '王五'],'年龄': [25, None, 30, 22],'成绩': [90, 85, None, 95]}
df = pd.DataFrame(data)# 检测空值
print(df.isnull())
print(df.isnull().sum()) # 每列空值数量统计
Pandas 把 n/a 和 NA 当作空数据,na 不是空数据,可以指定空数据类型:
import pandas as pd
missing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values = missing_values)
print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())
1.2 处理空值的方法
方法一:删除空值
# 删除包含空值的行
df_drop = df.dropna()
print(df_drop)# 删除全为空值的列
df_drop_col = df.dropna(axis=1, how='all')
方法二:填充空值
# 用固定值填充
df_fill = df.fillna(0)# 用列的平均值填充
df['年龄'] = df['年龄'].fillna(df['年龄'].mean())# 用前一个有效值填充
df_fill_ffill = df.fillna(method='ffill')# 用后一个有效值填充
df_fill_bfill = df.fillna(method='bfill')
2. Pandas 清洗格式错误日期
日期格式不一致是常见的数据问题,Pandas提供了强大的日期处理功能。
2.1 统一日期格式
# 创建含不同日期格式的DataFrame
date_data = {'日期': ['2023-01-01', '01/02/2023', '2023.03.01', '20230401', '2023/05/01']}
df_date = pd.DataFrame(date_data)# 统一转换为datetime格式
df_date['标准日期'] = pd.to_datetime(df_date['日期'], errors='coerce')
print(df_date)
2.2 处理日期异常
# 识别异常日期(如未来日期)
today = pd.to_datetime('today')
df_date['是否异常'] = df_date['标准日期'] > today# 提取日期组成部分
df_date['年份'] = df_date['标准日期'].dt.year
df_date['月份'] = df_date['标准日期'].dt.month
df_date['日'] = df_date['标准日期'].dt.day
3. Pandas 清洗错误数据
错误数据可能包括异常值、不合理值或拼写错误等。
3.1 识别错误数据
# 创建示例数据
data = {'姓名': ['张三', '李四', '王五', '赵六', '钱七'],'年龄': [25, 30, 150, 22, -5], # 包含不合理年龄'性别': ['男', '女', '男', '未知', '女']} # 包含不规范性别
df_error = pd.DataFrame(data)# 设置合理年龄范围
valid_age = (df_error['年龄'] > 0) & (df_error['年龄'] < 120)
print(df_error[~valid_age])
3.2 修正错误数据
# 替换不合理年龄为NaN
df_error.loc[~valid_age, '年龄'] = None# 标准化性别列
gender_map = {'男': '男', '女': '女', '未知': '其他'}
df_error['性别'] = df_error['性别'].map(gender_map).fillna('其他')# 使用条件替换
df_error['年龄'] = df_error['年龄'].apply(lambda x: x if 0 < x < 120 else None)
4. Pandas 清洗重复数据
重复数据会扭曲分析结果,需要谨慎处理。
4.1 检测重复数据
# 创建含重复数据的DataFrame
data = {'姓名': ['张三', '李四', '王五', '张三', '李四'],'年龄': [25, 30, 22, 25, 30],'成绩': [90, 85, 95, 90, 85]}
df_dup = pd.DataFrame(data)# 检测完全重复的行,如果对应的数据是重复的,**duplicated()** 会返回 True,否则返回 False。
print(df_dup.duplicated())# 检测特定列的重复
print(df_dup.duplicated(subset=['姓名', '年龄']))
4.2 处理重复数据
# 删除完全重复的行
df_no_dup = df_dup.drop_duplicates()# 保留第一次出现的重复行
df_first = df_dup.drop_duplicates(keep='first')# 保留最后一次出现的重复行
df_last = df_dup.drop_duplicates(keep='last')# 基于某些列删除重复行
df_specific = df_dup.drop_duplicates(subset=['姓名', '年龄'])
综合应用实例
# 综合数据清洗流程示例
def clean_data(df):# 处理空值df['年龄'] = df['年龄'].fillna(df['年龄'].median())df = df.dropna(subset=['姓名'])# 修正错误数据df['年龄'] = df['年龄'].apply(lambda x: x if 0 < x < 120 else None)# 删除重复数据df = df.drop_duplicates(subset=['姓名', '年龄'], keep='first')return dfcleaned_df = clean_data(df)
print(cleaned_df)
总结
数据清洗是数据分析的基础,本文介绍了Pandas在数据清洗中的四大核心应用:
-
空值处理:检测和填充/删除空值
-
日期格式化:统一日期格式,处理异常日期
-
错误数据修正:识别和修正异常值、不合理数据
-
重复数据处理:检测和删除重复数据
掌握这些技巧,你将能够处理大多数常见的数据质量问题,为后续的数据分析打下坚实基础。记住,没有"干净"的数据,就没有可靠的分析结果!