使用pandas清洗數據(中文字符串的正則使用)

      對於之前的從鏈家網爬取下來的福田區二手房的數據,只是爲了提取信息。但是如果要進行數據分析必須對數據進行清理和轉換。python的pandas庫可以說是中等規模數據處理最好用的工具。下面我就來演示如何對以下數據進行處理:

環境:

win10 pro

python3.6

pandas,re

26 105100952283  長城一花園南北通透精裝三房拓出飄窗好樓層好採光 長城花園   | 3室1廳 | 104.7平米 | 南 北 | 精裝 | 有電梯 低樓層(共17層)1987年建塔樓  -   百花 41人關注 / 共39次帶看 / 4個月以前發佈 距離3號線(龍崗線)華新站1151米 房本滿五年 780 萬 單價74499元 https://image1.ljcdn.com/440300-inspection/6ef5054c-c0bc-4979-89b7-2d3c07b6b8d4.jpg.280x210.jpg.232x174.jpg
27 105101016387  紅樹綠洲,南向通透兩房看花園,看房方便 房主自薦 紅樹綠洲   | 2室1廳 | 58.98平米 | 東南 | 精裝 | 有電梯 低樓層(共28層)2007年建板塔結合  -   福田保稅區 43人關注 / 共29次帶看 / 2個月以前發佈 距離3號線(龍崗線)益田站1176米 房本滿五年 365 萬 單價61886元 https://image1.ljcdn.com/440300-inspection/b8154d56-7fe9-43f0-a89d-fd32a93422a5.JPG.280x210.jpg.232x174.jpg

      首先介紹我對於在中文字符串中使用正則式的一點小經驗(關於正則表達式的基本使用方法和正則表達式的函數在本章不做說明):

示例:

an=' 綠景新美域 大兩房 東南向 地鐵口物業 業主誠心賣 綠景花園二期   | 2室1廳 | 72.68平米 | 南 | 精裝 低樓層(共29層)2005年建板塔結合  -  房本滿五年 472 萬 單價64943元'
print (re.findall(r'\s.{5}\s',an))
#用空格隔開,且有五個字符的字符串
print (re.search(r'\s(.{5,6})(?:期)\s+',an).group())
#找到首個有六個字符串短語  
print (re.search(r'\s(?:低)(.{10,20})(?:合)|(?:結)\s+',an).group())
#以低開始並以合結束的,中間10到20個字符的字符串
sp_an=[x for  x  in re.split(' ',an) if str(x) !='' and str(x).find('東')!=-1]
print (sp_an)
#字符串的find方法應用。用空格分割整個字符串並找到含有東這個字的字符串
sp_bn=[x for  x  in re.split(' ',an) if str(x) !='' and str(x).__contains__('房本')]
print (sp_bn)
#用空格分割字符串並找到含有房本這兩個字的字符
print ([x for x in re.findall('\S+',an) if str(x).__contains__('室')])
#找到字符串中不是空格的字符,並找到其中含有室這個字的字符串
print(re.match('(?P<de1>.*)\|(?P<de2>.*)\|(?P<de3>.*)\|(?P<de4>.*)\|(?P<de5>.*)-(?P<de6>.*)',an).group('de6'))
print (re.split('\s',an))
print (re.split('(口|業)',an))
print (re.search(r'\s(?:低|業)(.{3,20})(?:合|賣)\s+',an).group())
print (re.search(r'\d+(?:平米)',an).group())

如此我就能很輕鬆的將中間一列的信息切割成我需要的片段

import pandas as pd
import re
import numpy as np
import xlwings as xw

#########################################################
'''
該模塊主要清洗上述鏈家福田二手數據以便於分析,並將數據輸出到目標excel表格

結構化數據如下,利用正則表達式進行提取
大房間,大陽臺,滿五年,無增值稅,視野開闊 益田村   | 3室2廳 | 105.43平米 | 北 | 其他 中樓層(共24層)2002年建板塔結合  -   石廈 50人關注 / 共91次帶看 / 4個月以前發佈 距離3號線(龍崗線)益田站205米 房本滿五年 隨時看房 600 萬
'''

#####################################################################
lian=pd.read_excel(r'd:\\lianjia_ershou_futian_100.xlsx',sheet_name='Sheet1')
# 用正則將數據分割成爲了9列數據
patt=r'(?P<desc>.*)\s{3}\|(?P<room>.*?)\|(?P<size>.*?)\|(?P<direct>.*?)\|(?P<floor>.*)-\s{3}(?P<area>.*)\s{1}(?P<foucs>\d{1,4}.*)\/(?P<watch>.*)\/(?P<pubtime>.*)'
# print (lian['dec'].apply(lambda x:re.match(patt,x).group('direct')))
# 利用正則將dec分成9列數據
# 將dec列分成village和review
new_table=lian['dec'].str.extract(patt,expand=True)
new_table['village']=new_table['desc'].str.split(' ').str[-1]
new_table['review']=new_table['desc'].str.strip().str.split(' ').str[:-1].apply(lambda x:''.join(x))

# 將pubtime分成下面三列
new_table['pub_month']=new_table['pubtime'].str.split(' ').str[1]
new_table['price']=new_table['pubtime'].str.split(' ').str[-3:].apply(lambda x:''.join(x))
new_table['tr_other']=new_table['pubtime'].str.split(' ').str[2:-3].apply(lambda x:''.join(x))

# 將兩個表格合併併除去不需要的列
all_infor=pd.concat([lian,new_table],axis=1)
# print (all_infor.columns)
all_infor=all_infor[['code', 'review', 'village', 'area', 'room', 'size', 'direct', 'floor',
       'foucs', 'watch', 'pub_month', 'price',
       'tr_other', 'img']]



####################################################
# 將表格插入到存在的excel表格中
def table_insert_excel_sheets():
    book=xw.Book(r'd:\\lianjia_ershou_futian_100.xlsx')
# 下面這句話的意思是如果sheet是中含有名字是details的工作表,刪除該工作表。
    for a in book.sheets:
        if a.name in ['details']:
            a.delete()
    sht2=book.sheets.add('details')
    sht2.activate()
    sht2.range('a1').value=all_infor
    rng = sht2.range('A1').current_region
    rng.autofit()
    book.save()
    book.close()

table_insert_excel_sheets()



最後分割完成以後得到以下的形式:

  code review village area room size direct floor foucs watch pub_month price tr_other img
0 1.05101E+11 大房間,大陽臺,滿五年,無增值稅,視野開闊 益田村 石廈  3室2廳   105.43平米   北   其他 中樓層(共24層)2002年建板塔結合   50人關注   共91次帶看  4個月以前發佈 600萬單價56910元 距離3號線(龍崗線)益田站205米房本滿五年隨時看房 https://image1.ljcdn.com/440300-inspection/61a23ca4-1051-44dc-8821-b643bd6efe51.jpg.280x210.jpg.232x174.jpg
1 1.05101E+11 新洲大廈精裝三房,朝南向,滿五唯一紅本在手,有鑰匙房主自薦 新洲大廈 新洲  3室1廳   108.81平米   西南   精裝 | 有電梯 高樓層(共33層)1996年建板塔結合   196人關注   共94次帶看  7個月以前發佈 450萬單價41357元 距離3號線(龍崗線)石廈站858米房本滿五年隨時看房 https://image1.ljcdn.com/440300-inspection/ca66cec8-dbaa-4e5e-a67b-754beba94d00.JPG.280x210.jpg.232x174.jpg
2 1.05101E+11 京基御景華城2室1廳265萬 京基御景華城 赤尾  2室1廳   45.72平米   西北   其他 | 有電梯 中樓層(共34層)2005年建板塔結合   80人關注   共35次帶看  9天以前發佈 265萬單價57962元 距離7號線赤尾站189米房本滿五年隨時看房 https://image1.ljcdn.com/440300-inspection/af4e1303-8aa1-444d-a451-6eb172cb68bf.jpg.280x210.jpg.232x174.jpg
3 1.05101E+11 梅林一村多層圍合南向高層三房無遮擋採光好 梅林一村八區 梅林  3室2廳   92.39平米   南 西南   簡裝 | 有電梯 高樓層(共9層)1998年建板塔結合   4人關注   共33次帶看  1個月以前發佈 710萬單價76849元 距離9號線下梅林站698米房本滿五年隨時看房 https://image1.ljcdn.com/440300-inspection/30e3a8b7-40f2-4f81-b9d1-6276c1443bf4.jpg.280x210.jpg.232x174.jpg
4 1.05101E+11 高層,看海景通風流暢給您一個舒適又便宜的家庭 新洲大廈 新洲  4室1廳   108.81平米   西南   毛坯 中樓層(共33層)1996年建板塔結合   44人關注   共24次帶看  9天以前發佈 430萬單價39519元 距離3號線(龍崗線)石廈站898米房本滿五年 https://image1.ljcdn.com/440300-inspection/37c48102-5921-4331-abf5-dfbab3927e63.jpg.280x210.jpg.232x174.jpg
5 1.05101E+11 正規大2房,贈送18平大陽臺可改3房,滿五年唯一稅費少房主自薦 尚書苑 梅林  2室1廳   55.12平米   西北   簡裝 低樓層(共16層)2005年建板塔結合   8人關注   共6次帶看  8天以前發佈 375萬單價68034元 距離9號線梅景站227米房本滿五年 https://image1.ljcdn.com/440300-inspection/019bfc1c-b44f-427f-a595-9c84c3c76aed.jpg.280x210.jpg.232x174.jpg
6 1.05101E+11 紅樹林邊上海景剛需小戶型這價格不能錯過滿五唯一 紅樹家鄰 上下沙  2室1廳   55.36平米   南   其他 | 有電梯 高樓層(共9層)2003年建板樓   373人關注   共80次帶看  5個月以前發佈 315萬單價56901元 距離9號線下沙站766米房本滿五年 https://image1.ljcdn.com/440300-inspection/5cc9b66a-c261-49d1-ace9-2fd8faf0a282.jpg.280x210.jpg.232x174.jpg
7 1.05101E+11 水木瀾山居南向兩房客廳贈送大陽臺安靜08年較新小區 水木瀾山居 梅林  2室1廳   74.23平米   南   簡裝 | 有電梯 低樓層(共31層)2008年建板塔結合   41人關注   共87次帶看  2個月以前發佈 525萬單價70727元 距離9號線孖嶺站565米房本滿五年隨時看房 https://image1.ljcdn.com/440300-inspection/a0232395-6213-411d-a306-c27d7c77598b.jpg.280x210.jpg.232x174.jpg
這些只是數據的清洗工作。需要按照需要做進一步的轉化和抽取。我會在下一篇文章中寫出實際的操作。

如有意見,請留言或者聯繫本人[email protected]




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章