Python數(shù)據(jù)科學(xué)(七)- 資料清理(Ⅱ)


傳送門:

1.資料轉(zhuǎn)換

1.套用向量化計(jì)算(例子依然使用我們采集的房天下的數(shù)據(jù))

  • 計(jì)算新價(jià)格
df['總價(jià)'] * 1000
  • 使用 Numpy計(jì)算新的價(jià)格
np.sqrt() 代表開根號(hào)

import numpy as np
np.sqrt(df['總價(jià)'])
  • 合并兩字符串
df['朝向'] + df['戶型']
  • 將新計(jì)算的均價(jià)存入DataFrame
df['均價(jià)'] = df['總價(jià)'] * 1000 / df['建筑面積']

2.定義函數(shù)進(jìn)行套用

  • map:將函數(shù)套用到Series 上的每個(gè)元素

eg. 移除物業(yè)費(fèi)中的元

def removeDollar(e):
      return e.split('元')[0]

df['物業(yè)費(fèi)'].map(removeDollar)

eg. 使用匿名函式

df['物業(yè)費(fèi)'].map(lambda  e: e.split('元')[0])
  • Apply:將函數(shù)套用到DataFrame 上的行與列

eg:

df = pandas.DataFrame([
                      [60,70,50],\
                      [80,79,68],\
                      [63,66,82]], columns = ['First', 'Second', 'Third']
)
# 以列進(jìn)行計(jì)算
df.apply(lambda e: e.max() - e.min())
# 以行進(jìn)行計(jì)算
df.apply(lambda e: e.max() - e.min(), axis = 1)
  • ApplyMap:將函式套用到DataFrame上的每個(gè)元素(elementwise)
    將所有暫無資料的元素替代成缺失值(NaN)
import numpy as np
df.applymap(lambda e :np.nan  if e == '暫無資料' else e)

2.處理時(shí)間格式資料

  • 打印出現(xiàn)在的時(shí)間
from datetime import datetime 
current_time = datetime.now()
  • 將時(shí)間轉(zhuǎn)換成字符串
current_time.strftime('%Y-%m-%d')
  • 將字符串轉(zhuǎn)化為時(shí)間
datetime.strptime('2017-04-21', '%Y-%m-%d')
  • 時(shí)間回溯
from datetime import timedelta
current_time - timedelta(days = 1)
  • 往前回溯10天(這里的適用場景是想取得過去10天的資訊)
for i in range(1, 10):
        dt = currnet_time - timedelta(days = i)
        print(dt.strftime('%Y-%m-%d'))

注意:這里的時(shí)間轉(zhuǎn)換后的格式可以根據(jù)需要設(shè)定邓梅,eg:dt.strftime('%Y/%m/%d')

3.轉(zhuǎn)換UNIX時(shí)間始花,即從1970年1月1日到現(xiàn)在過了多少秒

  • 將datetime轉(zhuǎn)換為UNIX timestamp
from time import mktime
mktime(current_time.timetuple())
  • 將UNIX timestamp 轉(zhuǎn)換為datetime
datetime.fromtimestamp(1492859823)

4.在pandas轉(zhuǎn)換時(shí)間

  • 轉(zhuǎn)換前


import pandas
df = pandas.read_excel('data/house_sample.xlsx')
df['張貼日期'] = pandas.to_datetime(df['張貼日期'], format = '西元%Y年%m月%d日')
  • 轉(zhuǎn)換后


3.重塑資料

1.虛擬變量(Dummy Variable)

百度百科:虛擬變量 ( Dummy Variables) 又稱虛設(shè)變量嫌拣、名義變量或啞變量桦卒,用以反映質(zhì)的屬性的一個(gè)人工變量马昨,是量化了的自變量,通常取值為0或1饺窿。引入啞變量可使線形回歸模型變得更復(fù)雜穿撮,但對問題描述更簡明哀托,一個(gè)方程能達(dá)到兩個(gè)方程的作用惦辛,而且接近現(xiàn)實(shí)。
eg:如下表中的朝向就可以建立一個(gè)虛擬變量

  • 建立虛擬變量
pandas.get_dummies(df['朝向'])
  • 合并虛擬變量與原DataFrame
df = pandas.concat([df, pandas.get_dummies(df['朝向'])], axis = 1)
  • 舍棄原有字段
df.drop('朝向', axis = 1)

2.建立透視表(pivot_table)

df2 = df.pivot_table(index = '張貼日期', columns = '產(chǎn)權(quán)性質(zhì)', values = '總價(jià)', aggfunc = sum, fill_value = 0) 
# fill_value = 0 指代的是把NaN替換成0
df2.head()
沒加fill_value = 0的結(jié)果
加過fill_value = 0的結(jié)果
df3 = df.pivot_table(index = '產(chǎn)權(quán)性質(zhì)', columns = '張貼日期', values = '總價(jià)', aggfunc = sum)
df3.head()


另外仓手,兩者進(jìn)行轉(zhuǎn)換的話也可以直接通過df2.T做轉(zhuǎn)換胖齐。

3.長寬表格的轉(zhuǎn)換(stack & unstack)

  • 建立多索引的透視表
df_multi_idx = df.pivot_table(index=['樓層', '裝修'],columns='張貼日期', values='總價(jià)', aggfunc=sum)
  • 轉(zhuǎn)換為寬表格
df_wide = df_multi_idx.unstack()
df_wide.head()
  • 轉(zhuǎn)換為長表格
df_long = df_wide.stack()
df_long.head()

4.學(xué)習(xí)正則表達(dá)式

1.正則表達(dá)式概述

正則表達(dá)式玻淑,又稱正規(guī)表示式、正規(guī)表示法呀伙、正規(guī)表達(dá)式补履、規(guī)則表達(dá)式、常規(guī)表示法(英語:Regular Expression剿另,在代碼中常簡寫為regex干像、regexp或RE),是計(jì)算機(jī)科學(xué)的一個(gè)概念驰弄。正則表達(dá)式使用單個(gè)字符串來描述、匹配一系列匹配某個(gè)句法規(guī)則的字符串速客。在很多文本編輯器里戚篙,正則表達(dá)式通常被用來檢索、替換那些匹配某個(gè)模式的文本溺职。

Regular Expression的“Regular”一般被譯為“正則”岔擂、“正規(guī)”、“常規(guī)”浪耘。此處的“Regular”即是“規(guī)則”乱灵、“規(guī)律”的意思,Regular Expression即“描述某種規(guī)則的表達(dá)式”之意七冲。

Python通過re模塊提供對正則表達(dá)式的支持痛倚。使用re的一般步驟是先使用re.compile()函數(shù),將正則表達(dá)式的字符串形式編譯為Pattern實(shí)例澜躺,然后使用Pattern實(shí)例處理文本并獲得匹配結(jié)果(一個(gè)Match實(shí)例)蝉稳,最后使用Match實(shí)例獲得信息,進(jìn)行其他的操作掘鄙。

1.正則表達(dá)式(Regular Expression):查詢和匹配字符串的規(guī)則

2.正則表達(dá)式表示數(shù)據(jù)
普通字符: 元數(shù)據(jù)耘戚,可以用于匹配指定的字符
r = “a”:用于在目標(biāo)字符串中匹配小寫字母a元字符
r = “.”:用于匹配任意一個(gè)字符
r = “\”:轉(zhuǎn)移字符~用于將一個(gè)普通的字符,轉(zhuǎn)義成一個(gè)有意義的字符
r = “\d”:表示一個(gè)0~9之間的整數(shù)
r = “\D”:表示一個(gè)非數(shù)字字符
r = “\w”:表示任意一個(gè)0~9或者字母或者下劃線的字符
r = “\W”:表示任意一個(gè)特殊字符
r = “\s”:表示匹配一個(gè)空白字符
r = “\S”:表示匹配一個(gè)非空白字符
r = “^”:匹配字符串的開頭位置
r = “$”:匹配字符串的結(jié)束位置
r = “\d*”:表示前面匹配的字符出現(xiàn)了0次或者多次
r = “\d?”:表示前面匹配的字符出現(xiàn)了0次或者1次
r =”\d+”:表示前面匹配的字符出現(xiàn)了1次或者多次

#范圍匹配
分組匹配方式:將多個(gè)匹配字符當(dāng)成一個(gè)完整的匹配公式
(abc):用于在目標(biāo)字符串中查詢abc同時(shí)出現(xiàn)的地方 
選擇匹配方式:將指定的多個(gè)字符操漠,選擇其中一個(gè)進(jìn)行匹配
[abc]:用于在目標(biāo)字符串中收津,查詢a或者b或者c出現(xiàn)的地方
[0-9]:用于匹配一個(gè)0~9之間的數(shù)字->等價(jià)于\d
[a-z]:用于匹配一個(gè)a-z之間的字母
[A-Z]:用于匹配一個(gè)A-Z之間的字母
[a-zA-Z]:用于匹配一個(gè)字母【大小寫均可】
[a-zA-Z0-9_]:用于匹配一個(gè)非特殊字符,等價(jià)于\w

#范圍匹配
\d{m, n}:匹配到的字符出現(xiàn)了至少m次浊伙,最多n次
\d{,20}:匹配一個(gè)數(shù)字最多出現(xiàn)20次
\d{8,}:匹配一個(gè)數(shù)字撞秋,最少出現(xiàn)8次
\d{8,16}:匹配一個(gè)數(shù)字,最少出現(xiàn)8次嚣鄙,最多出現(xiàn)16次

#正則表達(dá)式在python中的使用
正則表達(dá)式部服,在python中,主要用到了一個(gè)re模塊
compile():編譯正則表達(dá)式
pattern = re.compile(“^\d{2,}$”)
pattern = r‘^\d{2,}$’

pattern.match(str,begin,end):從指定的字符串str第一個(gè)字符查詢匹配的字符

pattern.search(str, begin, end):從指定的字符串中直接進(jìn)行查詢拗慨,查詢到的第一個(gè)結(jié)果作為匹配結(jié)果

pattern.findall(str):從指定的字符串中廓八,查詢符合匹配規(guī)則的字符奉芦,將所有符合的字符存放在一個(gè)列表中

pattern.finditer(str):從指定的字符串中,查詢符合匹配規(guī)則的字符保存在一個(gè)可以迭代的對象中

pattern.sub():替換
pattern.split():拆分

eg:

import re
email = 'zhiji@github.com'
m = re.match('(\w+)@([a-z\.]+)', email)
or
m = re.match('(\w+)@(.+)', email)
>>>m.group(1)
zhiji
>>>m.group(2)
github.com
>>>m.groups()
('zhiji', 'github.com')

2.在DataFrame上使用正規(guī)表達(dá)式

  • 從戶型用正規(guī)表達(dá)式抽取室剧蹂、廳声功、廚、衛(wèi)欄位


    未處理的數(shù)據(jù)
df[['室', '廳', '廚', '衛(wèi)']] = df['戶型'].str.extract('(\d+)室(\d+)廳(\d+)廚(\d+)衛(wèi)', expand=False)
使用正則處理過的數(shù)據(jù)

之前寫過詳細(xì)的正則表達(dá)式的文章宠叼,傳送門在這里正則表達(dá)式先巴。

5.實(shí)例處理

我們通過對新浪微博新聞數(shù)據(jù)的采集和處理作為案例

import requests
import pandas
import re
from bs4 import BeautifulSoup

def get_article(url):
    res1 = requests.get(url)
    res1.encoding = 'utf-8'
    soup1 = BeautifulSoup(res1.text, 'html.parser')
    dic = {}
    dic['title'] = soup1.select('.page-header #artibodyTitle')[0].text
    dic['content'] = ''.join([ele.text for ele in soup1.select('.article_16 p')])
    dic['source'] = soup1.select('#navtimeSource')[0].text
    dic['keyword'] = soup1.select('.article-info .article-keywords')[0].text
    return dic

def get_all_news():
    res = requests.get('http://news.sina.com.cn/china/')
    res.encoding = 'utf-8'
    soup = BeautifulSoup(res.text, 'html.parser')
    newsary = []
    for link in soup.select('.news-item'):
        if len(link.select('h2 a')) > 0:
            newsary.append(get_article(link.select('h2 a')[0]['href']))
    df = pandas.DataFrame(newsary)
    # 進(jìn)行數(shù)據(jù)清理
    df['keyword'] = df['keyword'].map(lambda e: e.split(':')[1].split())
    # df['source'] = df['source'].map(lambda e: e.split())
    df[['datetime', 'from']] = df['source'].str.extract('(\d+年\d+月\d+日\d+:\d+)[\t|\n]+?(\w+)', expand=False)
    print(df[['datetime', 'from']])
    # 因?yàn)閐f['datetime']是object格式,為了后期的取值,例:取年df['datetime'].map(lambda e : e.year) 我們需要把格式轉(zhuǎn)換為時(shí)間格式
    df['datetime'] = pandas.to_datetime(df['datetime'], format = '%Y年%m月%d日%H:%M')
    del df['source']
    # 對即將保存的格式進(jìn)行調(diào)整
    df = df[['from', 'title', 'content', 'keyword', 'datetime']]
    # 將整理好的數(shù)據(jù)儲(chǔ)存Excel
    df.to_excel('news.xlsx')

if __name__ == '__main__':
    get_all_news()

經(jīng)過清理轉(zhuǎn)換后的數(shù)據(jù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冒冬,隨后出現(xiàn)的幾起案子伸蚯,更是在濱河造成了極大的恐慌,老刑警劉巖简烤,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剂邮,死亡現(xiàn)場離奇詭異,居然都是意外死亡横侦,警方通過查閱死者的電腦和手機(jī)挥萌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枉侧,“玉大人引瀑,你說我怎么就攤上這事≌ツ伲” “怎么了憨栽?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翼虫。 經(jīng)常有香客問我徒像,道長,這世上最難降的妖魔是什么蛙讥? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任锯蛀,我火速辦了婚禮,結(jié)果婚禮上次慢,老公的妹妹穿的比我還像新娘旁涤。我一直安慰自己,他們只是感情好迫像,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布劈愚。 她就那樣靜靜地躺著,像睡著了一般闻妓。 火紅的嫁衣襯著肌膚如雪菌羽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天由缆,我揣著相機(jī)與錄音注祖,去河邊找鬼猾蒂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛是晨,可吹牛的內(nèi)容都是我干的肚菠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼罩缴,長吁一口氣:“原來是場噩夢啊……” “哼蚊逢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起箫章,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤烙荷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后檬寂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體终抽,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年焰薄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扒袖。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塞茅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出季率,到底是詐尸還是另有隱情野瘦,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布飒泻,位于F島的核電站鞭光,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泞遗。R本人自食惡果不足惜惰许,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望史辙。 院中可真熱鬧汹买,春花似錦、人聲如沸聊倔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耙蔑。三九已至见妒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甸陌,已是汗流浹背须揣。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工盐股, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人返敬。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓遂庄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親劲赠。 傳聞我的和親對象是個(gè)殘疾皇子涛目,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349