数据清洗与预处理是数据分析的重要步骤,旨在提高数据质量和分析结果的可靠性。常见的数据清洗任务包括处理缺失值、重复数据、异常值、数据类型转换等。以下是详细的讲解和可运行的Python案例。
1. 处理缺失值
缺失值是数据清洗中常见的问题,可以通过删除含有缺失值的行或列、填充缺失值等方法处理。
示例
import pandas as pd
import numpy as np
# 创建包含缺失值的数据帧
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', np.nan],
'Age': [25, np.nan, 35, 45, 55],
'City': ['New York', 'Los Angeles', np.nan, 'Chicago', 'Houston']}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 删除包含缺失值的行
df_dropna = df.dropna()
print("\n删除缺失值后的数据:")
print(df_dropna)
# 填充缺失值
df_fillna = df.fillna({'Name': 'Unknown', 'Age': df['Age'].mean(), 'City': 'Unknown'})
print("\n填充缺失值后的数据:")
print(df_fillna)
2. 处理重复数据
重复数据会影响分析结果的准确性,可以通过删除重复数据来处理。
示例
# 创建包含重复值的数据帧
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Alice'],
'Age': [25, 30, 35, 45, 25],
'City': ['New York', 'Los Angeles', 'Chicago', 'Chicago', 'New York']}
df = pd.DataFrame(data)
print("\n原始数据:")
print(df)
# 删除重复行
df_dedup = df.drop_duplicates()
print("\n删除重复值后的数据:")
print(df_dedup)
3. 处理异常值
异常值是偏离大多数数据点的值,可能是数据录入错误或真实存在的极端值。可以使用统计方法或可视化手段识别和处理异常值。
示例
import matplotlib.pyplot as plt
# 创建包含异常值的数据帧
data = {'Value': [10, 12, 12, 13, 15, 100, 12, 11, 13, 12]}
df = pd.DataFrame(data)
print("\n原始数据:")
print(df)
# 使用箱线图识别异常值
plt.boxplot(df['Value'])
plt.title("Boxplot of Values")
plt.show()
# 删除异常值
q1 = df['Value'].quantile(0.25)
q3 = df['Value'].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
df_no_outliers = df[(df['Value'] >= lower_bound) & (df['Value'] <= upper_bound)]
print("\n删除异常值后的数据:")
print(df_no_outliers)
4. 数据类型转换
数据类型不匹配会导致数据处理和分析时出现错误,可以通过类型转换解决这个问题。
示例
# 创建包含数据类型不匹配的数据帧
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': ['25', '30', '35'],
'Salary': ['50000', '60000', '70000']}
df = pd.DataFrame(data)
print("\n原始数据:")
print(df)
# 转换数据类型
df['Age'] = df['Age'].astype(int)
df['Salary'] = df['Salary'].astype(float)
print("\n转换数据类型后的数据:")
print(df.dtypes)
print(df)
5. 可运行的Python案例
下面是一个完整的Python程序,演示了数据清洗与预处理的基本操作,包括处理缺失值、重复数据、异常值和数据类型转换。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 1. 处理缺失值
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', np.nan],
'Age': [25, np.nan, 35, 45, 55],
'City': ['New York', 'Los Angeles', np.nan, 'Chicago', 'Houston']}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
# 删除包含缺失值的行
df_dropna = df.dropna()
print("\n删除缺失值后的数据:")
print(df_dropna)
# 填充缺失值
df_fillna = df.fillna({'Name': 'Unknown', 'Age': df['Age'].mean(), 'City': 'Unknown'})
print("\n填充缺失值后的数据:")
print(df_fillna)
# 2. 处理重复数据
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Alice'],
'Age': [25, 30, 35, 45, 25],
'City': ['New York', 'Los Angeles', 'Chicago', 'Chicago', 'New York']}
df = pd.DataFrame(data)
print("\n原始数据:")
print(df)
# 删除重复行
df_dedup = df.drop_duplicates()
print("\n删除重复值后的数据:")
print(df_dedup)
# 3. 处理异常值
data = {'Value': [10, 12, 12, 13, 15, 100, 12, 11, 13, 12]}
df = pd.DataFrame(data)
print("\n原始数据:")
print(df)
# 使用箱线图识别异常值
plt.boxplot(df['Value'])
plt.title("Boxplot of Values")
plt.show()
# 删除异常值
q1 = df['Value'].quantile(0.25)
q3 = df['Value'].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
df_no_outliers = df[(df['Value'] >= lower_bound) & (df['Value'] <= upper_bound)]
print("\n删除异常值后的数据:")
print(df_no_outliers)
# 4. 数据类型转换
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': ['25', '30', '35'],
'Salary': ['50000', '60000', '70000']}
df = pd.DataFrame(data)
print("\n原始数据:")
print(df)
# 转换数据类型
df['Age'] = df['Age'].astype(int)
df['Salary'] = df['Salary'].astype(float)
print("\n转换数据类型后的数据:")
print(df.dtypes)
print(df)