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


傳送門:

成功爬取到我們所需要的數(shù)據(jù)以后妖泄,接下來應(yīng)該做的是對(duì)資料進(jìn)行清理和轉(zhuǎn)換庶艾, 很多人遇到這種情況最自然地反應(yīng)就是“寫個(gè)腳本”痒筒,當(dāng)然這也算是一個(gè)很好的解決方法兑凿,但是,python中還有一些第三方庫纽哥,像Numpy,Pandas等概行,不僅可以快速簡(jiǎn)單地清理數(shù)據(jù)细层,還可以讓非編程的人員輕松地看見和使用你的數(shù)據(jù)瓣颅。接下來就讓我們一起學(xué)習(xí)使用Pandas!

1.Pandas

什么是Pandas?
百度百科:Python Data Analysis Library 或 pandas 是基于NumPy 的一種工具倦逐,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。Pandas 納入了大量庫和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型弄捕,提供了高效地操作大型數(shù)據(jù)集所需的工具。pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法导帝。你很快就會(huì)發(fā)現(xiàn)守谓,它是使Python成為強(qiáng)大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一。

以下我們主要通過一些范例進(jìn)行學(xué)習(xí)您单。

1.資料篩選

#存儲(chǔ)元素與切割
import pandas as pd
df = pd.DataFrame(info)
df.ix[1]
# 查看特定的列
df[['name', 'age']]
# 查看特定列的特定內(nèi)容
df.ix[1:2, ['name', 'age'] ]
  • 使用 & 取條件交集
df[(df['gender'] == 'M')&(df['age'] >= 30)]
  • 使用 | 取條件集合
df[(df['gender'] == 'M')|(df['age'] >= 30)]
  • 新增/刪除欄位


 # 新增欄位
df['employee'] = True

# 刪除欄位
del df['employee']    OR   df = df.drop('employee', 1)

# 新增第六列
df.loc[6] = {'age':20, 'gender':'F', 'name':'qoo'}
OR
df.append(pd.DataFrame([{'age':20, 'gender':'F', 'name':'qoo'}]), ignore_index=True)

# 刪除第六列
df = df.drop(6)
  • 設(shè)定新的索引
# 新增的欄位
df['userid'] = range(101, 107) 

# 設(shè)置新的索引
df. set_index('userid', inplace=True)
  • 根據(jù)位置取值
# iloc可以根據(jù)位置取值
df.iloc[1]
# 查看1,3,5 列的數(shù)據(jù)
df.iloc[[1,3,5]]
  • 根據(jù)索引取值
# 使用ix取值,通過行號(hào)索引 
df.ix[[101,103,105]]

# 使用loc取值斋荞,即使用標(biāo)簽索引行數(shù)據(jù)
df.loc[[101,103,105]]

2.偵測(cè)遺失值

  • 缺失值是指數(shù)據(jù)中有特定或者一個(gè)范圍的值是不完全的
  • 缺失值可能會(huì)導(dǎo)致數(shù)據(jù)分析時(shí)產(chǎn)生偏誤的推論
  • 缺失值可能來自機(jī)械的缺失或者人為的缺失
    • 機(jī)械缺失 例: 機(jī)械故障,導(dǎo)致數(shù)據(jù)無法被完整保存
    • 人為缺失 例:受訪者拒絕透露部分信息
import pandas as pd
import numpy as np
df = pd.DataFrame([\
                  ['frank', 'M', np.nan],\
                  ['mary', np.nan, np.nan],\
                  ['tom', 'M', 35],\
                  ['ted', 'M', 33],\
                  ['jean', np.nan, 21],\
                  ['lisa', 'F', 20]]
)
df. columns = ['name', 'gender', 'age']
df 
  • 檢查序列是否有缺失值
# 檢查非缺失值數(shù)據(jù)
df['gender'].notnull()

# 檢查缺失值資料
df['gender'].isnull()
  • 檢查字段是否含有缺失值
# 檢查字段是否含有缺失值
df['age'].isnull().values.any()

# 檢查DataFrame 是否還有缺失值 返回True/False
df.isnull().values.any()
  • 計(jì)算缺失值的數(shù)量
# 檢查某個(gè)字段缺失值的數(shù)量
df['age'].isnull().sum()

# 檢查字段缺失值的數(shù)量
df.isnull().sum()

# 計(jì)算所有缺失值的數(shù)量
df.isnull().sum().sum()
分開計(jì)算每一欄缺失值的數(shù)量

3.補(bǔ)齊遺失值

處理缺失值常規(guī)的有以下幾種方法

  • 舍棄缺失值
    • 這種情況適用于當(dāng)缺失值占數(shù)據(jù)比例很低時(shí)
  • 使用平均數(shù)平酿、中位數(shù)、眾數(shù)等敘述性統(tǒng)計(jì)補(bǔ)齊缺失值
  • 使用內(nèi)插法補(bǔ)齊缺失值
    • 如果字段數(shù)據(jù)成線性規(guī)律

1.舍棄缺失值

  • 舍棄含有任意缺失值的行
df.dropna()
  • 舍棄所有字段都含有缺失值的行
df.dropna(how='all')
  • 舍棄超過兩欄缺失值的行
df.dropna(thresh=2)

2.舍棄含有缺失值的列

  • 增加一包含缺失值的列
df['employee'] = np.nan
  • 舍棄皆為缺失值的列
df.dropna(axis=1, how = 'all')
  • 使用0值表示沿著每一列或行標(biāo)簽\索引值向下執(zhí)行方法
  • 使用1值表示沿著每一行或者列標(biāo)簽?zāi)O驁?zhí)行對(duì)應(yīng)的方法

下圖代表在DataFrame當(dāng)中axis為0和1時(shí)分別代表的含義(axis參數(shù)作用方向圖示):


3.填補(bǔ)缺失值

  • 用0填補(bǔ)缺失值
df.fillna(0)
  • 用平均數(shù)缺失值
    df['age'].mean()是age這個(gè)字段平均值
df['age'].fillna(df['age'].mean())  
  • 用各性別年齡平均填缺失值
df['age'].fillna(df.groupby('gender')['age'].transform('mean'), inplace = True)

4.向前/向后填值

  • 向后填補(bǔ)缺失值
df.fillna(method='pad')
  • 向前填補(bǔ)缺失值
df.fillna(method='bfill', limit=2)
  • pad/ffill:往后填值
  • bfill/backfill:往前填值

注意:這里的往前往后是指的從上往下

5.使用內(nèi)插法填補(bǔ)缺失值

df2 = pd.DataFrame([[1,870],\
                   [2,900],\
                   [np.nan,np.nan],\
                   [4,950],\
                   [5,1080],\
                   [6,1200]])
df2.columns = ['time', 'val']
df2.interpolate()
按照線性規(guī)律填補(bǔ)完的結(jié)果

6.總結(jié)

上一階段我們已經(jīng)爬取了房天下的二手房信息,這里對(duì)我們抓取到的二手房信息進(jìn)行處理

# 把暫無資料替換成物業(yè)費(fèi)
df[df['物業(yè)費(fèi)'] == ‘暫無資料’俺驶, ‘物業(yè)費(fèi)’] = np.nan

# 在打開文件的時(shí)候,直接把暫無資料替換成缺失值
df = pandas.read_csv('data/house_data.csv', na_values = '暫無資料'暮现, index_col = 0)

# 檢視前三行數(shù)據(jù)
df.head(3)

# 檢視后三行資料
df.tail(3)
  • 檢視DataFrame信息
df.info()
  • 檢視字段名稱
df.columns
  • 檢視字段型態(tài)
df.dtypes
  • 取得敘述性統(tǒng)計(jì)
df.describe()
  • 判斷欄位是否有缺失值的存在
df.isnull().any()
  • 統(tǒng)計(jì)欄位缺失值的數(shù)量
df.isnull().sum()
  • 舍棄參考月供這一列
df = df.drop('參考月供', axis = 1)
  • 篩選字段,篩選出產(chǎn)權(quán)性質(zhì)中各種產(chǎn)權(quán)所占的數(shù)量
df['產(chǎn)權(quán)性質(zhì)'].value_counts()
  • 篩選出建筑面積大于100且總價(jià)大于2000萬的房產(chǎn)信息
    注意:ix[ ,]中,前是條件栖袋,,是欄位
df.ix[(df['建筑面積'] > 100) & (df['總價(jià)'] > 2000), ].head(1)
  • 篩選出產(chǎn)權(quán)性質(zhì)為個(gè)人產(chǎn)權(quán)的房產(chǎn)信息
df = df[df['產(chǎn)權(quán)性質(zhì)'] == ‘個(gè)人產(chǎn)權(quán)’]
  • 對(duì)總價(jià)中缺失值進(jìn)行合理的補(bǔ)全
df['總價(jià)'] = df['總價(jià)'].fillna(df['建筑面積'] * (df['總價(jià)'] / df['建筑面積']).mean())
  • 將數(shù)據(jù)寫入CSV中
df.to_csv('house_final.csv', index_label = False)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拍顷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子塘幅,更是在濱河造成了極大的恐慌昔案,老刑警劉巖尿贫,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異爱沟,居然都是意外死亡帅霜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門呼伸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來身冀,“玉大人,你說我怎么就攤上這事括享÷Ц” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵铃辖,是天一觀的道長(zhǎng)剩愧。 經(jīng)常有香客問我,道長(zhǎng)娇斩,這世上最難降的妖魔是什么仁卷? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮犬第,結(jié)果婚禮上锦积,老公的妹妹穿的比我還像新娘。我一直安慰自己歉嗓,他們只是感情好丰介,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鉴分,像睡著了一般哮幢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上志珍,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天橙垢,我揣著相機(jī)與錄音,去河邊找鬼伦糯。 笑死钢悲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舔株。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼惭等,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼辞做!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稚补,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤框喳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后乍惊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體润绎,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莉撇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年棍郎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坝撑。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抚笔,靈堂內(nèi)的尸體忽然破棺而出殊橙,到底是詐尸還是另有隱情,我是刑警寧澤叠纹,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布誉察,位于F島的核電站持偏,受9級(jí)特大地震影響驼卖,放射性物質(zhì)發(fā)生泄漏酌畜。R本人自食惡果不足惜桥胞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一埠戳、第九天 我趴在偏房一處隱蔽的房頂上張望蕉扮。 院中可真熱鬧,春花似錦屁使、人聲如沸蛮寂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匕垫,卻和暖如春象泵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偶惠。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工忽孽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扒腕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蹋盆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子栖雾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348