python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python数据清洗与预处理

Python中数据清洗与预处理技巧分享

作者:钮祜禄.爱因斯晨

我们不论在学习机器学习还是数据分析中,都会涉及很多数据,为了确保结果的准确性,我们需要首先进行数据清洗和预处理,下面我们就来看看如何使用Python进行数据清洗与预处理吧

前言

我们不论在学习机器学习还是数据分析中,都会涉及很多数据。但原数据不可避免有很多杂志,为了确保结果的准确性,我们需要首先进行数据清洗和预处理。

了解数据清洗

数据清洗就像是一场数据的“大扫除”。它是从原始数据中找出并修正那些错误、不完整、重复或不一致的数据。通过数据清洗,能显著提升数据质量,为后续数据分析、挖掘和建模等工作提供准确、可靠、干净的数据基础,从而让基于数据得出的结论更具可信度和价值。

数据清洗的步骤

1. 环境准备与库导入

import pandas as pd  # 数据处理核心库
import numpy as np   # 数值计算库
import matplotlib.pyplot as plt  # 基础可视化库
import seaborn as sns  # 高级可视化库

# 设置显示参数,确保中文正常显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
pd.set_option('display.max_columns', None)  # 显示所有列
pd.set_option('display.width', 1000)        # 显示宽度

函数 / 参数解释

2. 数据加载

# 从CSV文件加载数据
df = pd.read_csv('data.csv')

# 从Excel文件加载数据(支持多工作表)
excel_file = pd.ExcelFile('data.xlsx')
df = excel_file.parse('Sheet1')  # 读取名为Sheet1的工作表

# 查看数据规模
print(f"数据集规模:{df.shape[0]}行,{df.shape[1]}列")

函数解释

pd.read_csv():读取 CSV 文件并返回 DataFrame 对象。

pd.ExcelFile()parse()

3. 数据初探与理解

# 查看数据基本信息
print("数据基本信息:")
df.info()

# 查看前5行数据
print("\n数据前5行:")
print(df.head())

# 查看数值型列的统计描述
print("\n数值型列统计描述:")
print(df.describe())

# 查看类别型列的取值分布
print("\n类别型列取值分布:")
for col in df.select_dtypes(include=['object', 'category']).columns:
    print(f"\n{col}列分布:")
    print(df[col].value_counts())

函数解释

4. 缺失值处理

# 1. 检测缺失值
missing_count = df.isnull().sum()  # 计算每列缺失值数量
missing_ratio = missing_count / len(df)  # 计算缺失比例
missing_df = pd.DataFrame({
    '缺失值数量': missing_count,
    '缺失比例': missing_ratio
})
print("缺失值统计:")
print(missing_df[missing_df['缺失值数量'] > 0])  # 只显示有缺失值的列

# 2. 处理缺失值
# 方法1:删除缺失值(适用于缺失比例极低的情况)
df_drop = df.dropna(axis=0)  # 按行删除,axis=1按列删除

# 方法2:填充缺失值
# 数值型列用均值/中位数填充
df['数值列1'] = df['数值列1'].fillna(df['数值列1'].mean())  # 均值填充
df['数值列2'] = df['数值列2'].fillna(df['数值列2'].median())  # 中位数填充

# 类别型列用众数填充
df['类别列1'] = df['类别列1'].fillna(df['类别列1'].mode()[0])  # 众数填充

# 方法3:用前后值填充(适用于时间序列)
df['时间序列列'] = df['时间序列列'].fillna(method='ffill')  # 向前填充
# df['时间序列列'] = df['时间序列列'].fillna(method='bfill')  # 向后填充

函数解释

5. 重复值处理

# 1. 检测重复行
duplicate_rows = df.duplicated()  # 返回布尔型Series,标记是否为重复行
print(f"重复行数量:{duplicate_rows.sum()}")

# 2. 查看重复行内容
if duplicate_rows.sum() > 0:
    print("重复行内容:")
    print(df[duplicate_rows])

# 3. 删除重复行
df_clean = df.drop_duplicates(keep='first')  # 保留第一次出现的行
# df_clean = df.drop_duplicates(keep='last')  # 保留最后一次出现的行
# df_clean = df.drop_duplicates(keep=False)   # 删除所有重复行

print(f"删除重复行后:{df_clean.shape[0]}行")

函数解释

duplicated():检测重复行,返回布尔型 Series。

drop_duplicates():删除重复行,参数keep控制保留策略:

6. 异常值处理

# 1. 绘制箱线图可视化异常值
plt.figure(figsize=(12, 6))
sns.boxplot(data=df.select_dtypes(include=np.number))  # 只对数值列绘图
plt.title('数值列箱线图(用于检测异常值)')
plt.tight_layout()
plt.show()

# 2. 使用IQR方法检测异常值
def detect_outliers(df, col):
    """检测指定列的异常值"""
    Q1 = df[col].quantile(0.25)  # 下四分位数
    Q3 = df[col].quantile(0.75)  # 上四分位数
    IQR = Q3 - Q1  # 四分位距
    lower_bound = Q1 - 1.5 * IQR  # 下界
    upper_bound = Q3 + 1.5 * IQR  # 上界
    outliers = df[(df[col] < lower_bound) | (df[col] > upper_bound)]
    return outliers, lower_bound, upper_bound

# 处理每个数值列的异常值
for col in df.select_dtypes(include=np.number).columns:
    outliers, lower, upper = detect_outliers(df, col)
    if not outliers.empty:
        print(f"{col}列异常值数量:{len(outliers)}")
        
        # 方法1:删除异常值
        # df = df.drop(outliers.index)
        
        # 方法2:截断异常值(替换为边界值)
        df.loc[df[col] < lower, col] = lower
        df.loc[df[col] > upper, col] = upper

函数解释

7. 数据类型转换

# 查看当前数据类型
print("原始数据类型:")
print(df.dtypes)

# 1. 转换为数值类型(处理字符串格式的数值)
df['数值列'] = pd.to_numeric(df['数值列'], errors='coerce')  # 无法转换的值变为NaN

# 2. 转换为日期类型
df['日期列'] = pd.to_datetime(df['日期列'], format='%Y-%m-%d')  # 指定格式加速转换

# 3. 转换为类别类型(适用于取值有限的字符串列)
df['类别列'] = df['类别列'].astype('category')

# 查看转换后的数据类型
print("\n转换后数据类型:")
print(df.dtypes)

函数解释

8. 数据标准化 / 归一化(预处理)

# 1. 标准化(Z-score标准化,使均值为0,标准差为1)
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
numeric_cols = df.select_dtypes(include=np.number).columns
df[numeric_cols] = scaler.fit_transform(df[numeric_cols])

# 2. 归一化(Min-Max归一化,将值缩放到[0,1]范围)
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df[numeric_cols] = scaler.fit_transform(df[numeric_cols])

# 查看处理后的统计描述
print("标准化/归一化后统计描述:")
print(df[numeric_cols].describe())

函数解释

实例实践

以鸢尾花数据集为例

原数据集:在资源绑定中

#导入库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#设置显示选项
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

# 使用原始字符串处理文件路径
excel_file = r'C:\Users\einsc\PycharmProjects\PythonProject\.venv\share\yuan\iris_dataset.xlsx'

#获取表名
sheet_names = pd.ExcelFile(excel_file).sheet_names
print(sheet_names)

#读取数据
df = pd.ExcelFile(excel_file).parse('Sheet1')

print("数据基本信息")
df.info()
rows, columns = df.shape
print(f"数据的行数: {rows}")
print(f"数据的列数: {columns}")
print("数据的前几行")
print(df.head())

# 处理缺失值
print("缺失值统计:")
print(df.isnull().sum())
# 若存在缺失值,这里选择用列均值填充数值型列,用众数填充类别型列
for col in df.columns:
    if df[col].dtype == 'object':
        df[col] = df[col].fillna(df[col].mode()[0])
    else:
        df[col] = df[col].fillna(df[col].mean())

# 处理重复值
print("重复值数量:", df.duplicated().sum())
# 删除重复值
df = df.drop_duplicates()

# 处理异常值(使用 IQR 方法)
numerical_columns = df.select_dtypes(include=[np.number]).columns
for col in numerical_columns:
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    df = df[(df[col] >= lower_bound) & (df[col] <= upper_bound)]

# 重置索引
df = df.reset_index(drop=True)

print("清洗后数据基本信息")
df.info()
print("清洗后数据行数: ", df.shape[0])
print("清洗后数据列数: ", df.shape[1])

# 定义保存路径
output_file = r'C:\Users\einsc\PycharmProjects\PythonProject\.venv\share\yuan\iris_dataset_cleaned.xlsx'
# 将清洗后的数据保存到新的 Excel 文件
df.to_excel(output_file, index=False, sheet_name='CleanedData')
print(f"清洗后的数据已保存到 {output_file}")
print("数据的前几行")

处理结果:

总结

本文聚焦机器学习中的数据清洗与预处理。先阐述其重要性,如同为数据“大扫除”,能提升数据质量、保障结论可靠。接着分八个步骤详细讲解,从环境准备与库导入,到数据加载、初探,再到缺失值、重复值、异常值处理,以及数据类型转换和标准化/归一化,每个步骤都有代码示例和函数解释。最后以鸢尾花数据集为例实践,经各环节处理后保存清洗数据。整体内容系统全面,理论与实践结合,助读者掌握数据清洗与预处理的关键要点和操作。

以上就是Python中数据清洗与预处理技巧分享的详细内容,更多关于Python数据清洗与预处理的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文