项目背景
希望将房间信息生成一些量化指标和宏观指标
任务要求
将 室内描述 量化和清洗
结果类似于:
实战
去重
整体看看有哪些指标,先去重,目的是想把指标选出来,有这个指标我就打上1,没有就打0 (效果如上图)
利用集合的特性(不关注重复性和顺序)来去重用set(data[' xxx '])
去重后更方便看看到底有哪些指标,发现去重后 室内描述 这一列的数据从41484下降到了1597条
用正则来切分生成list
1,首先观察数据,找到切分的符号
Excel中 数据–筛选 进行查看
分割符号是 , - /
正则公式re.split(r'符号|符号|符号', 字符串名)
2,排除掉空格这种影响切分的非符号
我想把里面的 床空格-空格电视
变成 床-电视
用 replace(' ','')
以第一行为例,进行正则分割和空格的替换:
s='床,wifi,电视,洗衣机,冰箱,暖气,空调,热水器'
re.split(r',|-|/',s.replace(' ',''))
3,遍历整列
list()
是强转为list列表
4,删去无效指标
遍历生成的去重指标列表中空字符串''
,和'暂无信息'
'暂无资料'
这种就手动删除
思路是把要删除的指标生成一个列表存起来,遍历这个列表里面的指标,在result里面remove这些指标
5,特殊处理(指标名不同但含义相同)
链接:apply和lambda
#1,电视:有线电视,电视机,彩电,电视
#2,天然气:天然气,管道燃气,燃气,煤气
#3,车位:车库,车位
总体思路:只要电视
,天然气
,车位
这三列,例如:有电视,就在房间描述出现‘电视’这一列标1,或者在房间描述出现‘彩电’也标1,或者在房间描述出现‘电视机’也标1,或者在房间描述出现‘有线电视’也标1,判断标1还是0这个操作可以用lambda函数来实现,他和def定义一个函数效果一样,但是更方便,适用于这种简单的函数操作。用apply函数把判断好的1,0标注到电视,天然气,车位这三列上。
以电视为例:
data['电视']=data['室内描述'].apply(lambda x:1 if '电视' in x or '彩电' in x else 0)
最后再把这些特殊处理的列名全部从上一步的标签result中remove
(因为刚才已经用apply将1,0标到电视,天然气,车位这三列上了,所以这三列也可以remove)
数值化处理
剩下34个还没标1,0的指标,result里面有的指标就标1,没有就标0
导出完整数据
data.to_excel('导出文件名.xlsx',header=True,index=False)
#header是列名,index是索引序号
最后结果:
全文代码
### 导包
import pandas as pd
import numpy as np
import re
### 导数据
data = pd.read_excel(r'楼盘数据.xlsx') #Excel文件是 pd.read_excel(r'xxx.xlsx')
data.info()
#将数据中值为空的赋值为空字符串 fillna('')
data = data.fillna('')
data.info()
# set()去重
shinei = list(set(data['室内描述']))
len(shinei)
#以第一个为例正则,生成list
s = '床,wifi,电视,洗衣机,冰箱,暖气,空调,热水器'
s.replace(' ','')
re.split(r',|-|/',s.replace(' ',''))
#循环遍历整列生成所有list
result = []
for i in shinei:
result.extend(re.split(r',|-|/',i.replace(' ',''))) #extend()是追加列表可以多个对象,append只追加单个对象
result = list(set(result)) #去重
print(len(result))
print(result)
move_shinei =['','暂无信息','暂无资料'] #把要删除的指标生成一个列表
for j in move_shinei:
result.remove(j)#在result里面删除move_shinei列表里的指标
print(len(result))
print(result)
### 特殊处理
#1,电视:有线电视,电视机,彩电,电视
data['电视'] = data['室内描述'].apply(lambda x:1 if '电视'in x or '彩电' in x else 0)
#2,天然气:天然气,管道燃气,燃气,煤气
data['天然气'] = data['室内描述'].apply(lambda x:1 if '天然气' in x or '燃气'in x or '煤气'in x else 0 )
#3,车位:车库,车位
data['车位']=data['室内描述'].apply(lambda x:1 if '车库'in x or '车位'in x else 0)
teshu_shinei = ['有线电视','电视机','彩电','电视','天然气','管道燃气','燃气','煤气','车库','车位']
for k in teshu_shinei:
result.remove(k)
print(len(result))
print(result)
### 数值化处理
for shinei in result:
data[shinei] = data['室内描述'].apply(lambda x:1 if shinei in x else 0)
data.head()
data
### 导出完整数据
data.to_excel('楼盘数据_清洗.xlsx',header=True,index=False)