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

news2024/11/25 0:28:44

图片

 在综合实战项目中,“北京链家网”租房数据的抓取任务已在 上一篇 完成,得到了数据表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 pd
import 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,4
5,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()]))  # 原地修改 df
df.drop duplicates(inplace=True)print('----打印删除重复行后 df 的行数----)
print(len(df))

输出结果为:

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

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

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

输出结果为:

----未做缺失值处理之前---
floor       0
lift        8
district    0
street      0
community   0
area        0
toward      0
mode1       0
rent        4
dtype: 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       0
lift        0
district    0
street      0
community   0
area        0
toward      0
mode1       0
rent        4
dtype: int64

----将rent列有缺失值的行直接删除---
floor       0
lift        0
district    0
street      0
community   0
area        0
toward      0
mode1       0
rent        0
dtype: int64
4322

删除带缺失值的行后,此时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.00
1     107.00
2     72
3     71.13
4     54.41
5     132.00
Name: 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 model
print(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 列统一为*室*厅*卫----
rent
38000.0
0    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     totalfloor
0    中楼层         6
1    低楼层         17
2    中楼层         6
3    中楼层         8
4    中楼层         4
 

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【从删库到跑路】MySQL数据库的索引(二)——索引的使用和选择

🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【The Right Path】 🥰欢迎并且感谢大家指出小吉的问题 文章目录 🍔索引的使用⭐验证索引效率🎈细节 ⭐最左前缀法则…

Linux系统之安装MySQL8.0版本

Linux系统之安装MySQL8.0版本 一、MySQL介绍1.1 MySQL简介1.2 MySQL特点 二、本次实践介绍2.1 环境规划2.2 本次实践目的 三、卸载mariadb数据库3.1 卸载mariadb数据库3.2 卸载mysql数据库 四、配置yum仓库4.1 下载rpm文件4.2 配置yum仓库4.3 检查yum仓库状态4.4 检查mysql版本…

香橙派Zero2基于wiringPi外设库的实验(超声波测距)

超声波测距原理&#xff0c;原理可以查看下面的文章&#xff0c;这里就不赘述了 [51单片机超声波测距](http://t.csdn.cn/eYbod)在Linux中使用超声波测距会用到的时间相关的API和结构体 包含的头文件以及函数原型和时间结构体timveal原型#include<sys/time.h>int getti…

windows部署安装redis安装教程

1、下载redishttps://github.com/tporadowski/redis/releases 2、下载完然后双击安装 比较简单 略过 3、测试是否安装成功 提示bug Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf …

ffplay播放器剖析(8)----逐帧/音量调节/快进快退/倍数分析

文章目录 1.逐帧播放2. 音量调节3. seek 快进 快退4.倍速 1.逐帧播放 逐帧播放就是按s键触发的,调用step_to_next_frame触发 static void step_to_next_frame(VideoState *is) {/* if the stream is paused unpause it, then step */if (is->paused)stream_toggle_pause(i…

jmeter随记2:压测

jmeter随记1:压测 简述一、压测步骤二、观察cpu和内存占用情况三、查看磁盘占用情况 简述 关于压测&#xff0c;jmeter更直观的作用是用来编写压测脚本【请求和压测策略】&#xff0c;然后在linux服务器上执行&#xff0c;也可以在本地执行&#xff0c;压测执行脚本在启动jmet…

PHP注册/登录/发邮件--【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库程序基本流程项目目录如图&#xff1a;注册zhuce.html配套资源作业&#xff1a; 本系列校训 用免费公开视频&#xff0c;卷飞培训班哈人&…

Oracle物化视图刷新和物化视图日志

Oracle物化视图刷新和物化视图日志 Oracle的物化视图是包括一个查询结果的数据库对像&#xff0c;它是远程数据的的本地副本&#xff0c;或者用来生成基于数据表求和的汇总表。 测试物化视图的刷新&#xff0c;参考物化视图日志&#xff0c;一个源表对应多个物化视图刷新。 物…

【Linux工具篇】项目自动构建化工具-make/Makefile

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 &#x1f4ab…

matlab cross()函数叉乘 计算过程详解

向量叉乘 在数学上&#xff0c;两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。在Matlab中&#xff0c;用函数cross实现。 函数 cross() 格式 C cross(A,B) %若A、B为向量&#xff0c;则返回A与B的叉乘&#xff0c;即CAB&#xff0c;A、B必须是3个…

c#封装bool到cpp

c#那边传一个结构体&#xff0c;结构体里包含两个bool&#xff0c;封送到cpp&#xff0c;结果发现cpp那边读取有问题。一看cpp接收变量的内存&#xff0c;两个bool占的内存都不是一个字节了&#xff0c;再次记录原因。 封送的时候&#xff0c;默认是占4个字节&#xff0c;如果…

Pycharm----导入库文件夹不在py文件的目录下

问题描述&#xff1a; 想在不同目录下导入根目录的包&#xff0c;直接写会报错。如下边object_detect.py在function文件夹下&#xff0c;导入包默认在这个文件下&#xff0c;但我想导入根目录models和utils下的包 解决方法&#xff1a; 将根目录设置为源代码根目录&#xff0…

linux静态库,动态库总结

1.介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据&#xff0c;这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化&#xff0c;更容易重新编译&#xff…

【Spring Cloud】Hystrix熔断机制

文章目录 前言什么是hystrix的熔断&#xff1f;使用hystrix熔断功能的配置Hystrix 工作原理Hystrix工作流 前言 什么是hystrix的熔断&#xff1f; hystrix熔断主要是指在一定的时间窗口内&#xff0c;当请求的次数达到一定的失败比率后&#xff0c;hystrix就会主动拒绝服务&a…

【图像分割】基于浣熊优化算法COA的Otsu(大津法)多阈值电表数字图像分割 电表数字识别【Matlab代码#52】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 原始COA算法1.1 开发阶段1.2 探索阶段 2. 多阈值Otsu原理3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 原始…

长尾式差分放大电路

3.3.2差分放大电路 电路 条件 静态分析 对共模信号的抑制作用 当产生温度变化时&#xff0c;也类似加入了共模信号&#xff0c;由于负反馈电阻 的存在&#xff0c;会产生如下变化。 对差模信号的放大作用 电路 交流等效电路 具体分析 具有恒流源的差分放大电路 电路 详细分析…

STM32 OLED显示汉字及屏幕滚动(I2C协议)

文章目录 一、任务目标二、材料准备硬件&#xff1a;软件&#xff1a; 三、AHT20温湿度传感器的使用四、OLED的使用1.硬件2.字模汉字编码原理取字模 3.工程4.电路连接5.实验效果 五、总结六、参考资料 一、任务目标 理解OLED屏显和汉字点阵编码原理&#xff0c;使用STM32F103的…

Linux下基本指令 -> ls指令

​ Linux - ls 1 简介2 简介3 语法4 常用选项4.1 -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件4.2 -l 列出文件的详细信息4.3 -d 将目录象文件一样显示&#xff0c;而不是显示其下的文件4.4 -i 输出文件的 i 节点的索引信息4.5 -n 用数字的 UID,GID 代替名称4.…

Qt学习14:Designer设计师

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 Qt项目地址及源码&#xff1a;点击这里 什么是Designer设计师&#xff1f; 简单来说就是通过拖拖拽拽就可以实现窗口上控件的布局。 1. 创建带UI文件的项目 我们在之前的学习中都是不用这个按钮的&#xff0c;现在我们需…

富文本CKEditor5简易入门,包括自定义上传图片(html版+vue.js)

一、安装及引入 官网&#xff1a;https://ckeditor.com/ckeditor-5/download/ 我这边使用的是自定义构建&#xff0c;然后下载下来。 二、简单使用 引入js <script src"../../../assets/plugins/ckeditor5/ckeditor.js"></script>html&#xff1a;…