AI 文章摘要

本文通过Jupyter Notebook演示了二手房数据的预处理流程,主要包括数据读取、缺失值处理、重复值删除、特征可视化(箱线图、直方图、密度图等)、特征编码、数据分箱、列合并与转换、数据缩放(归一化、标准化)以及降维(PCA)等步骤,旨在将原始数据转换为适合机器学习建模的格式。 阅读时间:约5-7分钟。
摘要更新时间:2026-06-21 23:27

以下对数据的预处理是基于jupyter notebook

1、读取一个csv文件内容(以安居客二手房源20条数据为例)

import pandas as pd

df = pd.read_csv('安居客房源.csv')  #括号内是此文件夹存放地址 
df.head(20)   #显示了所有的数据20条
安居客房源数据

2、读取信息数量与类型

df.info()
各类型数据数量与类型
可看到总价有20个非空数据,类型为float(依次往下)

3、删除重复列,以朝向为例

df1 = df.drop_duplicates(['朝向'],inplace=False) #不替换掉原始的df(inplace=False)
print(df1)
剩南、南北、东西

4、计数(计df1每一列有多少个数)

df1.count()

5、标识缺失值个数并从大到小排序(以上述csv文件内容为例)

total = df.isnull().sum().sort_values(ascending =False) 
print(total)
室缺三个,厅缺三个依次往后看

6、用缺省值画条形图

from matplotlib import pyplot as plot
plot.rcParams['font.sans-serif'] = "Microsoft YaHei" 
  #设置 Matplotlib 中文显示的字体为 "Microsoft YaHei"。(微软雅黑)
total.plot.bar()  
条形图
室与厅为3,其余为0,与上述统计的一样

7、缺省值按百分比降序排列

percentage = (df.isnull().sum()/len(df)).sort_values(ascending = False)  #ascending = False降序排列
print(percentage)
缺失值百分比:缺失个数除以总数

8、缺失率水平条形图展示

percentage.plot.barh()
水平条形图

9、把csv文件里的总价用箱线图表示

df['总价(万)'].plot.box() 
箱线图
箱线图:一种可视化工具,用于展示数据的分布情况、中位数、四分位数和异常值。

10、总价直方图(纵坐标是此价格的个数)

df['总价(万)'].plot.hist()
直方图

11、面积与总价的密度图

df['面积(千米)'].plot.density()
df['总价(万)'].plot.density(secondary_y = True)
密度图
橙色的是总价密度图,蓝色的是面积,可见,这俩成正比,价格与面积密度关系很大,升降趋势一样

12、删除地区这一列

del df['地区']
print(df)

13、填充缺省值

df['室'] = df['室'].fillna(df['室'].mode()[0])   #众数填充
df['厅'] = df['厅'].fillna(df['厅'].median())  #缺失值用该列的中位数填充
df.info()
都填充完成,填满了20个

14、把总价按区间划分,统计区间数量

bins = [0,100,200,300,400]
binresult = pd.cut(df['总价(万)'],bins)
print(binresult.value_counts().sort_index(axis = 0)) 
0到100万的有4个,100到两百的有14个,以此内推

15、加一列‘类型’,把总价再按区间分为多种类型

df['类型'] = pd.cut(df['总价(万)'],bins,labels = ['便宜', '正常', '昂贵', '非常贵'])
df.head(20)
因为上面进行了缺省值填充,所以数据全为非空了

16、使用饼图展示价格段分段计数

df['类型'].value_counts().plot.pie() 
饼图
可见,价格属于正常范围的偏多数

17、用映射把朝向一列的汉字变为数字来可以将这些数据用于算法模型训练和分析(机器只能识别数字),同时统计一下每个数字(朝向)多少个

direct_mapping={
    '南':'1',
    '东西':'2',
    '南北':'3',
}
df['朝向'] = df['朝向'].str.strip().map(direct_mapping)
df['朝向'].value_counts()

18、把需要的有用的列再合并为一个新的列

df['房间(总数)'] = df['室'] + df['厅'] + df['卫']
pd.set_option('display.max_columns',None)  #display.max_columns显示所有的列。因为存在表格过长列显示不全的情况,用此可以显示所有
df.head(20)
可以看到新加了一个列房间(总数),为室厅卫的和,再因为刚刚在上面把朝向已经转为了数字,所以显示的是用数字表示的朝向

19、合并必要的列重新整合成一个DataFrame

reserve = ['总价(万)', '面积(千米)', '均价', '朝向',  '房间(总数)']
data = df[reserve]
data.head(20)

20、生成数据集基本统计信息(计数(count)、均值(mean)、标准差(std)、最小值(min)、四分位数(25th百分位数、中位数、75th百分位数)、最大值(max))

data.describe()

21、在上述csv文件中,因为均价是带了单位的,因此此时需要转换为数字不带单位以让机器识别

data['均价'] = data['均价'].str.split('.',expand=True)[0] #以'.'分开取第一位
data.head(20)
均价已不带单位且类型为int

22、数据缩放(消除特征间的量纲差异,加速模型收敛,提高模型性能和鲁棒性),区间通常[0,1]

(1)将数据转换为NumPy类型数组

from sklearn.preprocessing import MinMaxScaler

tmp = MinMaxScaler().fit_transform(data)
type(tmp)

(2)将经过缩放处理后的数据 tmp转换为 Pandas DataFrame并获取数据概要

data1 = pd.DataFrame(tmp, columns = reserve)
data1.describe()

23、将数据进行标准化处理,即使得数据的每个特征都满足均值为0,标准差为1的正态分布。

from sklearn.preprocessing import StandardScaler   
tmp2 = StandardScaler().fit_transform(data)
data2 = pd.DataFrame(tmp2,columns = reserve)
data2.describe()

24、对数据进行归一化处理(通过将特征值缩放到统一的范围内,消除特征间的量纲差异,提高模型的性能、加速收敛速度,并增强模型对异常值的鲁棒性)

from sklearn.preprocessing import Normalizer  
tmp3 = Normalizer().fit_transform(data)
data3 = pd.DataFrame(tmp3,columns = reserve)
data3.describe()

25、数据关系

covf = data3['总价(万)'].cov(data3['均价'])   
print("总价与均价的协方差:",covf)
corf = data3['总价(万)'].corr(data3['均价'])
print("总价与均价的相关系数:",corf)
可知道在上述这20条数据里总价与均价整体成负相关

26、数据降维(减少数据维度、去除冗余信息、探索数据结构,加快模型训练速度,并简化数据以便更易理解和可视化,从而优化数据分析和建模的效率)

(1)将数据转化为NumPy类型数组

from sklearn.decomposition import PCA

pca = PCA(n_components=3) #n_components=3保留3个主要特征维度
x = data3.drop('朝向',axis = 1)
newX = pca.fit_transform(x)
type(newX)

(2)输出降维后的新的DataFrame

data4 = pd.DataFrame(newX)
data4.head(20)