机器学习预处理-表格数据的空值处理

机器学习预处理-表格数据的空值处理

机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的python可视化,可视化能够帮助我们了解数据的构成和分布,是我们进行机器学习的必备步骤。上文中也提及,原始的数据存在部分的缺失,需要进行数据的空值处理,下面进行介绍。

PY工程下载:机器学习预处理-表格数据的空值处理-py工程

目录

0、原始数据集空缺信息查看

使用下面代码进行数据集的加载,并查看数据集的描述信息:

python 复制代码
import pandas as pd
import os

HOUSING_PATH = os.path.join("datasets", "housing")  # 存储位置


def load_housing_data(housing_path=HOUSING_PATH):
    csv_path = os.path.join(housing_path, "housing.csv")
    return pd.read_csv(csv_path)  # 返回 包含所有数据的pandas DataFrame对象


housing = load_housing_data()
housing.info()#查看数据集属性描述

1、删除空值所在行

下面代码能够删除空值所在行,只要有空值,这一行都会被删除:

python 复制代码
housing_drop_row = housing.dropna()  # 删除包含空值的行
housing_drop_row.info()  # 查看数据集属性描述
output_path = os.path.join(HOUSING_PATH, "housing_drop_row.csv")  # 定义保存清理后数据的路径和文件名
housing_drop_row.to_csv(output_path, index=False)  # index=False 表示不保存行索引,将清理后的数据保存到新的 CSV 文件中

删除后的无空值数据如下所示:

2、删除空值所在列

下面代码能够删除空值所在列,只要有空值,这一列都会被删除(从上面截图看一共有9列,删除之后变成了8列):

python 复制代码
housing_drop_column = housing.dropna(axis=1)  # axis=1 表示按列操作
housing_drop_column.info()  # 查看数据集属性描述
output_path = os.path.join(HOUSING_PATH, "housing_drop_column.csv")  # 定义保存清理后数据的路径和文件名
housing_drop_column.to_csv(output_path, index=False)  # index=False 表示不保存行索引,将清理后的数据保存到新的 CSV 文件中

3、使用中位数、均值进行填补

python 复制代码
# 遍历DataFrame的每一列,用该列的中位数填补空值
housing_fill_median = housing.copy()
for column in housing_fill_median.columns:
    # 跳过非数值列,因为中位数仅适用于数值数据
    if housing_fill_median[column].dtype in ['int64', 'float64']:
        # fill_value = housing_fill_median[column].median()  # 计算中位数
        fill_value = housing_fill_median[column].mean()  # 计算均值
        housing_fill_median[column] = housing_fill_median[column].fillna(fill_value)  # 直接赋值
housing_fill_median.info()
output_path = os.path.join(HOUSING_PATH, "housing_fill_median.csv")  # 定义保存清理后数据的路径和文件名
housing_fill_median.to_csv(output_path, index=False)  # index=False 表示不保存行索引,将清理后的数据保存到新的 CSV 文件中

其中,修改下面代码的注释切换使用中位数、均值进行填充:

python 复制代码
# fill_value = housing_fill_median[column].median()  # 计算中位数
fill_value = housing_fill_median[column].mean()  # 计算均值

4、使用k-means算法进行补充

这是一种高级的方式,使用k-means对空值进行填充,如果部分数据是字符串的,则先对其进行编码后在进行K-Means 聚类处理

python 复制代码
# 使用 K-Means 填充空值
# 定义填补函数
def fill_missing_with_kmeans(df, n_clusters=5):
    df = df.copy()
    label_encoders = {}

    # 对非数值型特征进行编码
    for column in df.select_dtypes(exclude=[np.number]).columns:
        le = LabelEncoder()
        # 注意空值先暂时填充为一个特殊字符 '<missing>',避免 LabelEncoder 出错
        df[column] = df[column].fillna('<missing>')
        df[column] = le.fit_transform(df[column])
        label_encoders[column] = le

    # 找到含有空值的列
    missing_columns = df.columns[df.isnull().any()]

    # 针对每一列进行填补
    for column in missing_columns:
        # 提取当前列非空的数据用于聚类
        non_missing_data = df.loc[df[column].notnull(), :]
        missing_data = df.loc[df[column].isnull(), :]

        # 如果整列为空,直接跳过
        if non_missing_data.empty:
            continue

        # 使用 K-Means 聚类
        kmeans = KMeans(n_clusters=n_clusters, random_state=42)
        cluster_features = non_missing_data.drop(columns=[column])
        kmeans.fit(cluster_features)

        # 将每个非空数据点分配到一个簇,并计算簇中心的均值
        cluster_labels = kmeans.labels_

        for cluster_idx in range(n_clusters):
            # 当前簇的数据
            cluster_data = non_missing_data.loc[cluster_labels == cluster_idx]
            if column in df.select_dtypes(include=[np.number]).columns:
                # 如果是数值型特征,用簇中心的均值填充
                cluster_mean = cluster_data[column].mean()
            else:
                # 如果是编码后的字符串特征,用簇中最频繁的值填充
                cluster_mean = cluster_data[column].mode().iloc[0]

            # 填充缺失数据中属于该簇的值
            cluster_missing_data = missing_data[
                kmeans.predict(missing_data.drop(columns=[column])) == cluster_idx
                ]
            df.loc[cluster_missing_data.index, column] = cluster_mean

    # 反编码字符串特征
    for column, le in label_encoders.items():
        df[column] = le.inverse_transform(df[column].astype(int))

    return df

# 填充数据中的缺失值
housing_fill_kmeans = fill_missing_with_kmeans(housing)
housing_fill_kmeans.info()
output_path = os.path.join(HOUSING_PATH, "housing_fill_kmeans.csv")  # 定义保存清理后数据的路径和文件名
housing_fill_kmeans.to_csv(output_path, index=False)  # index=False 表示不保存行索引,将清理后的数据保存到新的 CSV 文件中
相关推荐
万事可爱^30 分钟前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
牧歌悠悠1 小时前
【深度学习】Unet的基础介绍
人工智能·深度学习·u-net
坚毅不拔的柠檬柠檬2 小时前
AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构
人工智能·chatgpt·文心一言
坚毅不拔的柠檬柠檬2 小时前
2025:人工智能重构人类文明的新纪元
人工智能·重构
jixunwulian2 小时前
DeepSeek赋能AI边缘计算网关,开启智能新时代!
人工智能·边缘计算
Archie_IT2 小时前
DeepSeek R1/V3满血版——在线体验与API调用
人工智能·深度学习·ai·自然语言处理
大数据追光猿2 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
灵感素材坊3 小时前
解锁音乐创作新技能:AI音乐网站的正确使用方式
人工智能·经验分享·音视频
xinxiyinhe4 小时前
如何设置Cursor中.cursorrules文件
人工智能·python
AI服务老曹4 小时前
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
运维·人工智能·安全·开源·音视频