写点什么

Python 案例实现|租房网站数据表的处理与分析

作者:TiAmo
  • 2023-07-25
    江苏
  • 本文字数:3633 字

    阅读完需:约 12 分钟

Python案例实现|租房网站数据表的处理与分析

在综合实战项目中,“北京链家网”租房数据的抓取任务已在 上一篇 完成,得到了数据表 bj_lianJia.csv,如图 1 所示。该数据表包含 ID、城区名(district)、街道名(street)、小区名(community)、楼层信息(floor)、有无电梯(lift)、面积(area)、房屋朝向(toward)、户型(model)、房租(rent)等信息。


■ 图 1 “北京链家网”租房数据表的部分数据展示

01、案例实现

本节将任务进行如下分解。

(1) 重复行的处理:删除重复行。

(2) 缺失值的处理:数据表中 lift 和 rent 列有缺失值,分别采用不同的缺失值处理方式。

(3) 内容格式清洗。

① 将 area 列的“m2”删掉,这样 area 列的数据变为数值型,方便后面的数据分析。

② 将 toward 列中字符间的空格删掉,例如删掉“南 北”中的空格,变为“南北”。

③ 将 model 列的内容格式转换为“厅*卫”,例如“2 房间 1 卫”转换为“2 室 0 厅 1 卫”。

(4) 属性重构造:从 floor 列中分离出总楼层,形成一个新列,命名为“totalfloor”,例如“中楼层/6 层”分离出总楼层“6”。

(5) 对房租 rent 列数据进行统计分析。

以上任务的实现步骤及代码如下。

(1) 导入库。其中 re 库为正则表达式库,是 Python 的标准库,主要用于字符串匹配。代码如下。

import pandas as pdimport re
复制代码

(2) 读入数据。使用 Pandas 库的 read_csv()方法读入“北京链家网”的租房数据集 bj_lianJia.csv,其中,header=0 表示数据表的第一行作为列名,usecols 参数值表示使用数据表中列号为 1~9 的数据,也就是不使用列号为 0 的“ID”这一列数据。读入的数据列分别是:楼层(floor)、有无电梯(lift)、城区名(district)、街道名(street)、小区名(community)、面积(area)、房屋朝向(toward)、户型(model)、房租(rent)。代码如下。

df=pd.read csv('bj lianJia.csv', encoding='gbk', header=0,usecols=[1,2,3,45,6,7,8,9])print(df)
复制代码

输出结果为:

         floor      lift   district     ...        model       0         中楼层/6层     无       房山      ...     2室2厅1卫   1         低楼层/17层    有       顺义      ...     3室1卫2         中楼层/6层     无       大兴      ...     2室1厅1卫...4338      高楼层/28层    有       朝阳      ...     2室1厅1卫4339      低楼层/2层     有       怀柔      ...     5室2厅5卫4340      低楼层/4层     无       通州      ...     4室2厅3卫
复制代码

(3) 重复值处理。首先检测有无重复行,使用 Pandas 库的 duplicated()方法。如果存在重复的行,使用 drop_duplicates()方法删除这些重复行。代码如下。

print ('----检测有无重复行----')print(len(dfldf.duplicated()]))  # 原地修改 dfdf.drop duplicates(inplace=True)print('----打印删除重复行后 df 的行数----)print(len(df))
复制代码

输出结果为:

- ---检测有无重复行- 15----打印删除重复行后 df 的行数----4326
复制代码

(4) 缺失值处理。首先统计含有缺失值的列及数量。代码如下。

print ('----未做缺失值处理之前----'!)print(df.isnul1() .sum())
复制代码

输出结果为:

----未做缺失值处理之前---floor       0lift        8district    0street      0community   0area        0toward      0mode1       0rent        4dtype: int64
复制代码


可以看出,lift 列有 8 个缺失值,rent 列存在 4 个缺失值,分别采取不同的方法对缺失值进行处理:使用填充法,将 lift 列的缺失值填充为固定值“未知”;使用删除法,对 rent 列有缺失值的行进行直接删除处理。代码如下。

print ('----将 lift 列的缺失值填充为"未知"---')df['lift'].fillna('未知’,inplace=True)print(df.isnul1() .sum())print ('----将 rent 有缺失值的行直接删除----')df.dropna(subset=['rent'],inplace=True)print(df.isnull() .sum() )print(len(df))   # 输出删除缺失值后 df 的行数
复制代码

输出结果为:

----将lift列的缺失值填充为“未知”---floor       0lift        0district    0street      0community   0area        0toward      0mode1       0rent        4dtype: int64
----将rent列有缺失值的行直接删除---floor 0lift 0district 0street 0community 0area 0toward 0mode1 0rent 0dtype: int644322
复制代码

删除带缺失值的行后,此时 DataFrame 不再是连续的索引,可以使用 reset_index()方法重置索引。代码如下。

df=df .reset index(drop=True)print(df)
复制代码

输出结果为:

            floor      lift   district     ...        model       0         中楼层/6层     无       房山      ...     2室2厅1卫   1         低楼层/17层    有       顺义      ...     3室1卫2         中楼层/6层     无       大兴      ...     2室1厅1卫...4319      中楼层/8层     有       朝阳      ...     3室1厅1卫4320      高楼层/28层    有       朝阳      ...     2室2厅1卫4321      低楼层/2层     无       怀柔      ...     5室2厅5卫[4322 rows x 9 columns]
复制代码

(5) 内容格式清洗。

① 将 area 列的“m2”删掉。首先使用正则表达式库 re 的 findall()方法将数据表中 area 列的数字提取出来,这时得到的 area 列表中的数据舍弃了“m2”,然后再将 area 列表的数据写回数据表中。代码如下。

area= re.findall('d+. d+',a) for a in df 'area'].values.tolist()]df['area']=[i for jin range(len(area)) for i in arealj]]print(df.loc[:5,'area'])
复制代码

输出结果为:

0     85.001     107.002     723     71.134     54.415     132.00Name: area,dtype: object
复制代码

② 将 toward 列中字符间的空格删掉。这里用到了 Series 对象的替换方法 str.replace(),语法格式为 series 对象 sr.replace(pat,repl),其中,参数 pat 表示要替换的字符串,repl 表示新字符串。在下面的代码中,df['toward']得到的数据类型为 Series 类型,在 replace()方法中,要替换的字符串使用了正则表达式'\s+',其含义是匹配任意多个空格,被替换的新字符串为空字符串,所以使用 replace()方法将查找到的空格替换成空串,即删除了空格。代码如下。

print(df.loc[:5,'toward'])df['toward']=df['toward'].str.replace('\s+',')
复制代码

输出结果为:

0  南北1  南2  南北3  东4  东5  南北Name: toward,dtype: object
复制代码

③ 将 model 列的内容格式转换为“卫”。由于原始数据表中户型 model 的取值为 3 室 2 厅 1 卫或 2 房间 1 卫形式,还有少数取值为“未知室 1 厅 1 卫”,户型的表现形式不统一,现将其统一为“卫”,转换规则是:房间表示为室,没有给出厅数目表示为 0 厅,未知室表示为 0 室。代码如下。

print ("----首先将 model 列中'未知·替换为'0'----")dff=dfLdfl'model'].str.contains('未知)==True]print'替换前:\n',dff)df.loc[dff.index,'model =dffl'model'].str.replace('未知',0')print('替换后:\n',df.loc dff.index])print("----然后将 model 列统一为¥室¥厅*卫----")model_n=_re.findall('d+',m) for m in dfl'model'] .values.tolist()]new model=list()for m in model n:if len(m)==3:new model.append(m[0]+'室'+m[1]+厅'+m[2]+'卫')elif len(m)==2:new model.append(m[o] +室'+0厅'+m[1]+卫')dfl'model =new modelprint(df.loc[:5,'model'])
复制代码

输出结果为:

----首先将 model 列中·未知,替换为 0'----替换前:             floor      lift   district   ...     model         rent  3964      低楼层/25层    有       海淀     ...   未知室 1厅1卫   38000.0[1 rows x 9 columns]替换后:             floor      lift   district   ...     model         rent  3964      低楼层/25层    有       海淀     ...   0室0厅0卫       38000.0[1 rows x 9 columns]----然后将 model 列统一为*室*厅*卫----rent38000.00    2室1厅1卫1    3室0厅1卫3    3室0厅2卫4    2室1厅1卫5    3室2厅2卫Name: model,dtype: object
复制代码

(6) 属性重构造:从 floor 列中分离出总楼层,形成一个新列。这里使用了字符串分割方法 split(),该方法通过指定分隔符对字符串进行切分,返回分割后的字符串列表,例如“中楼层/6 层”被 split()方法通过分隔符“/”切分为['中楼层','6 层']。然后将楼层写回到 df['floor']中,将总楼层中的数字使用 slice()方法提取出来,写入 df['totalfloor']。代码如下。

dff=df['floor'].str.split('/',expand=True)df['floor =dff 0]df['totalfloor']=dff[1].str.slice(0,-1,1)print(df.loc[:5,['floor','totalfloor']])
复制代码

输出结果为:

     floor     totalfloor0    中楼层         61    低楼层         172    中楼层         63    中楼层         84    中楼层         4
复制代码

(7) 对房租 rent 列数据进行统计分析。

(8) 保存处理后的数据。代码如下。

df.to csv('newbj lianJia.csv',encoding='gbk',index label='ID')
复制代码


发布于: 刚刚阅读数: 4
用户头像

TiAmo

关注

有能力爱自己,有余力爱别人! 2022-06-16 加入

CSDN全栈领域优质创作者,万粉博主;阿里云专家博主、星级博主、技术博主、阿里云问答官,阿里云MVP;华为云享专家;华为Iot专家;

评论

发布
暂无评论
Python案例实现|租房网站数据表的处理与分析_Python_TiAmo_InfoQ写作社区