载入数据
import pandas as pd
lj_data = pd.read_csv('./LJdata.csv')
lj_data.head(2)
规范一点,用英文的column name,这样免去了后续的一些问题(主要是编码问题)
lj_data.columns
Index(['区域', '地址', '标题', '户型', '面积', '价格', '楼层', '建造时间', '朝向', '更新时间', '看房人数',
'备注', '链接地址'],
dtype='object')
lj_data.columns = ['district', 'address', 'title', 'house_type', 'area', 'price', 'floor', 'build_time', 'direction', 'update_time', 'view_num', 'extra_info', 'link']
查看数据的形状和信息
lj_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2760 entries, 0 to 2759
Data columns (total 13 columns):
district 2760 non-null object
address 2760 non-null object
title 2760 non-null object
house_type 2760 non-null object
area 2760 non-null object
price 2760 non-null int64
floor 2760 non-null object
build_time 2758 non-null object ###
direction 2760 non-null object
update_time 2760 non-null object
view_num 2760 non-null int64
extra_info 2760 non-null object
link 2760 non-null object
dtypes: int64(2), object(11)
memory usage: 280.4+ KB
lj_data.describe()
price view_num
count 2760.000000 2760.000000
mean 7570.800725 13.448913
std 6316.204986 12.746202
min 1300.000000 0.000000
25% 4500.000000 4.000000
50% 6000.000000 10.000000
75% 8500.000000 19.000000
max 210000.000000 122.000000
lj_data.shape
(2760, 13)
找到最近更新信息的20套房子
lj_data.sort_values('update_time',ascending=False).head(20)
#sort_values按参数列排序
#pd.to_datetime(lj_data['update_time'])
平均看房人数
int(sum(lj_data['view_num'])/len(lj_data['view_num']))
13
房龄最小的20套房子的平均看房人数、平均面积…
import re
import numpy as np
def getnum(pattern,string):
getnum=re.findall(pattern,string)
if getnum:
return getnum[0]
return ''
lj_data['hbt']=lj_data.fillna('不知道')['build_time'].apply(lambda x:getnum('\d+',x))
lj_data['ha']=lj_data['area'].apply(lambda x:getnum('\d+',x))
newest20=lj_data.sort_values('hbt',ascending=False).head(20)
newest20['ha']=newest20['ha'].astype('int')
'newest20,mean visitor %s,mean size %s' % (sum(newest20['view_num'])/20,np.mean(newest20['ha'].values))
'newest20,mean visitor 10.65,mean size 98.75'
房子价格的分布(平均,方差,中位数)
lj_data['price'].agg(['mean','std','median'])
mean 7570.800725
std 6316.204986
median 6000.000000
Name: price, dtype: float64
最受欢迎的朝向(平均看房人数)
gbd=lj_data.groupby('direction')
for k,v in gbd:
kd=gbd.get_group(k) #获得k方向的数据项
mp=np.mean(kd['view_num'])
print(k,mp)
东 13.7283950617
东 东北 34.0
东 东南 8.0
东 东南 南 21.0
东 北 19.4545454545
东 南 13.0285714286
东 南 北 12.9523809524
东 南 西 19.0
东 南 西 北 10.3333333333
东 西 14.0288461538
东 西 北 12.0
东 西北 16.3333333333
东 西南 12.0
东北 15.393442623
东南 14.1937172775
东南 东北 3.0
东南 北 10.0
东南 南 10.8
东南 西 3.66666666667
东南 西北 11.6666666667
东南 西南 14.6666666667
北 16.3693693694
南 13.6678899083
南 北 11.6798810704
南 西 16.4615384615
南 西 北 15.4444444444
南 西北 6.88888888889
南 西南 6.33333333333
西 13.5870967742
西 北 28.25
西北 19.4782608696
西南 16.4394904459
西南 东北 12.0
西南 北 7.63636363636
西南 西 25.0
房型数量分布
lj_data['house_type'].value_counts() #value_counts计算某一列各组出现频次
2室1厅 1284
1室1厅 457
3室1厅 371
3室2厅 207
1室0厅 157
2室2厅 142
4室2厅 42
4室1厅 21
1室2厅 17
2室0厅 9
1房间1卫 8
5室2厅 8
2房间1卫 6
5室3厅 5
5室1厅 4
3房间2卫 4
4室3厅 3
3室0厅 3
3房间1卫 3
3室3厅 3
6室2厅 2
2房间2卫 2
5房间2卫 1
6室3厅 1
Name: house_type, dtype: int64
最受欢迎的房型
lj2=lj_data[['house_type','view_num']]
lj2.groupby('house_type').sum()
view_num
house_type
1室0厅 2242
1室1厅 7037
1室2厅 290
1房间1卫 74
2室0厅 142
2室1厅 17589
2室2厅 1789
2房间1卫 119
2房间2卫 32
3室0厅 32
3室1厅 4467
3室2厅 2458
3室3厅 12
3房间1卫 51
3房间2卫 57
4室1厅 156
4室2厅 398
4室3厅 30
5室1厅 21
5室2厅 43
5室3厅 32
5房间2卫 3
6室2厅 24
6室3厅 21
房子的平均租房价格(按平米算)
np.mean(lj_data['price']/lj_data['ha'].astype('float'))
87.722684299004541
最受关注的小区
ljadd=lj_data[['address','view_num']]
ljaddsum=ljadd.groupby('address').sum() #各小区被访问总数
ljaddsort=ljaddsum.sort_values('view_num',ascending=False) #根据view_num列排序
ljaddsort.iloc[0,:]
view_num 246
Name: 清芷园, dtype: int64
出租房源最多的小区
lj_data['address'].value_counts().head(1)
远洋山水 19
Name: address, dtype: int64
集中供暖和非集中供暖的有多少家,平均价格是多少
def count(col):
i=0
for x in col:
if '集中供暖' in x:
i=i+1
return i
count(lj_data['extra_info'])
2284
lj_data['ctlht']=lj_data['extra_info'].apply(lambda x:'集中供暖' in x)
sum(lj_data['ctlht']==True)
2284
不同房型的平均/最大/最小面积
dha=pd.DataFrame({'house_type':lj_data['house_type'],'house_area':lj_data['ha'].astype('float')})
dha.groupby('house_type').agg(['mean','max','min'])
house_area
mean max min
house_type
1室0厅 48.484076 140.0 19.0
1室1厅 54.669584 107.0 28.0
1室2厅 72.411765 109.0 45.0
1房间1卫 42.875000 48.0 35.0
2室0厅 49.888889 55.0 42.0
2室1厅 78.725857 194.0 26.0
2室2厅 106.028169 228.0 60.0
2房间1卫 60.166667 67.0 52.0
2房间2卫 37.000000 38.0 36.0
3室0厅 67.000000 70.0 61.0
3室1厅 114.237197 217.0 54.0
3室2厅 145.690821 255.0 79.0
3室3厅 144.000000 181.0 123.0
3房间1卫 85.333333 91.0 77.0
3房间2卫 46.750000 63.0 39.0
4室1厅 165.285714 330.0 87.0
4室2厅 196.333333 304.0 119.0
4室3厅 179.000000 237.0 150.0
5室1厅 138.250000 180.0 99.0
5室2厅 242.125000 332.0 181.0
5室3厅 191.600000 219.0 135.0
5房间2卫 158.000000 158.0 158.0
6室2厅 274.000000 316.0 232.0
6室3厅 720.000000 720.0 720.0
哪个地铁口附近的房子最多
import re
def findstation(reg,string,n):
fst=re.search(reg,string)
if fst:
return fst.group(n)
return ''
lj_data['fst']=lj_data['extra_info'].apply(lambda x : findstation('距离(.+线)(\\(.*?段\\))?(.+站).*',x,n=3)) #reg分组,r修饰字符串
lj_data['fst'].value_counts()
1086
达官营站 43
双井站 34
安华桥站 32
青年路站 30
十里堡站 28
阜通站 28
北苑路北站 25
望京站 24
立水桥南站 22
东湖渠站 21
苏州街站 20
东直门站 19
朝阳公园站 19
广渠门外站 19
广渠门内站 19
安立路站 17
太阳宫站 17
劲松站 17
三元桥站 17
和平里北街站 16
大望路站 16
梨园站 16
惠新西街北口站 15
潘家园站 15
车公庄西站 15
芍药居站 15
昌平站 15
西直门站 14
车道沟站 14
...
后沙峪站 2
金台夕照站 2
泥洼站 2
回龙观东大街站 2
农大南路站 1
枣营站 1
丰台科技园站 1
西北旺站 1
北海北站 1
肖村站 1
育知路站 1
北京站站 1
灯市口站 1
高碑店站 1
东单站 1
欢乐谷景区站 1
南邵站 1
国贸站 1
南楼梓庄站 1
广阳城站 1
郭公庄站 1
大钟寺站 1
呼家楼站 1
国家图书馆站 1
木樨地站 1
虎坊桥站 1
珠市口站 1
张自忠路站 1
复兴门站 1
天通苑南站 1
Name: fst, Length: 218, dtype: int64
地铁附近的房子平均价格 比 非地铁的高多少
#lj_data.drop(['hbt'],axis=1,inplace=True)
#lj_data['fst'].ix[0,['fst']]
lj_data['fstbool']=lj_data['fst']==''
a=lj_data[['price','fstbool']].groupby('fstbool').mean()
a.values[0]-a.values[1]
array([ 2414.36401381])
地铁附近的房源离地铁平均距离
#lj_data.drop(['fstbool'],axis=1,inplace=True)
import re
def findstation(reg,string,n):
fst=re.search(reg,string)
if fst:
return fst.group(n)
return 0
lj_data['subdis']=lj_data['extra_info'].apply(lambda x : findstation('距离(.+线)(\\(.*?段\\))?(.+站)(.+)米.*',x,n=4)) #reg分组,r修饰字符串
lj_data['subdis'].astype('float').mean()
435.20978260869566
把持不住了,写regular expression上瘾了。。。。
最多的在租楼层
#lj_data.drop('subdis',axis=1,inplace=True)
import re
def findfloor(reg,string,n):
ff=re.search(reg,string)
if ff:
return ff.group(n)
return '缺失楼层信息'
lj_data['sortfloor']=lj_data['floor'].apply(lambda x:findfloor('(.楼层).*',x,1))
lj_data['sortfloor'].value_counts()
中楼层 1026
高楼层 932
低楼层 798
缺失楼层信息 4
Name: sortfloor, dtype: int64
随时看房的房子比例
lj_data['csuitv']=lj_data['extra_info'].transform(lambda x:'随时看房' in x)
lj_data['csuitv'].mean()
0.99855072463768113