机器学习预处理-表格数据的空值处理
机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的python可视化,可视化能够帮助我们了解数据的构成和分布,是我们进行机器学习的必备步骤。上文中也提及,原始的数据存在部分的缺失,需要进行数据的空值处理,下面进行介绍。
PY工程下载:机器学习预处理-表格数据的空值处理-py工程
目录
- 机器学习预处理-表格数据的空值处理
- 0、原始数据集空缺信息查看
- 1、删除空值所在行
- 2、删除空值所在列
- 3、使用中位数、均值进行填补
- 4、使用k-means算法进行补充
0、原始数据集空缺信息查看
使用下面代码进行数据集的加载,并查看数据集的描述信息:
import pandas as pd
import osHOUSING_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、删除空值所在行
下面代码能够删除空值所在行,只要有空值,这一行都会被删除:
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列):
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、使用中位数、均值进行填补
# 遍历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 文件中
其中,修改下面代码的注释切换使用中位数、均值进行填充:
# fill_value = housing_fill_median[column].median() # 计算中位数
fill_value = housing_fill_median[column].mean() # 计算均值
4、使用k-means算法进行补充
这是一种高级的方式,使用k-means对空值进行填充,如果部分数据是字符串的,则先对其进行编码后在进行K-Means 聚类处理:
# 使用 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 文件中