BitTigerio 2018-05-17
由于上篇文章中爬取下来的数据不能直接用来分析,比如一个属性包含多个信息、数值型属性包含单位等,因此首先要对数据做一定的清洗,处理成需要的格式 。
import pandas as pd import numpy as np
#因为文件中包含中文,为正确读取需要进行中文编码 rent_data=pd.read_csv('rent_data.csv',encoding='gbk') rent_data.head()
初始属性解释:
rent_data.info()
输出: <class 'pandas.core.frame.DataFrame'> RangeIndex: 900 entries, 0 to 899 Data columns (total 5 columns): apartment 900 non-null object area 900 non-null object size 900 non-null object dis_to_subway 771 non-null object price 900 non-null int64 dtypes: int64(1), object(4) memory usage: 35.2+ KB
(1) 把apartment属性分为小区名称(name)与房间数(num_rooms)。
rent_data['name']=rent_data['apartment'].apply(lambda x: x.split('-')[][:-]) rent_data['num_rooms']=rent_data['apartment'].apply(lambda x: x.split('-')[][-:-])
(2)提取area属性中的区域信息(district)、位置信息(location)、地铁信息(subway)、站点信息(station)。
import re def get_district(area): matchobj=re.search(r'\[(.*)\]',area) return matchobj.group()[:] def get_location(area): matchobj=re.search(r'\[(.*)\]',area) return matchobj.group()[:] def get_subway(area): matchobj=re.search(r'\d+',area) if matchobj: return matchobj.group() else: return '' def get_station(area): matchobj=re.search(r'\d.{2}(.*)',area) if matchobj: return matchobj.group() else: return '' rent_data['district']=rent_data['area'].apply(get_district) rent_data['location']=rent_data['area'].apply(get_location) rent_data['subway']=rent_data['area'].apply(get_subway) rent_data['station']=rent_data['area'].apply(get_station)
(3)去掉房屋大小size字段的单位“㎡”,还有面积前面的“约”。
def get_size(size): size_split=size.split()[] matchobj=re.search(r'约(.+)',size_split) if matchobj: return matchobj.group() else: return size_split rent_data['size']=rent_data['size'].apply(get_size)
(4)从“距离地铁的距离”属性"dis_to_subway"中提取出距离。
rent_data['dis_to_subway']=rent_data['dis_to_subway'].fillna('') #补全空值 def get_distance(dis_to_subway): if not dis_to_subway=='': matchobj=re.search(r'\D{2,}(\d+)',dis_to_subway) return matchobj.group() else: return '' rent_data['dis_to_subway']=rent_data['dis_to_subway'].apply(get_distance)
rent_data.drop(['apartment','area'],axis=1,inplace=True) rent_data.sample(5)
rent_data.to_csv('rent_data_clean.csv',index=False) #存入csv文件