用pandas進(jìn)行簡單的數(shù)據(jù)預(yù)處理

最在參加了一個(gè)機(jī)器學(xué)習(xí)的競賽撵溃,又開始頻繁的使用pandas做數(shù)據(jù)的處理。發(fā)現(xiàn)了一些之前沒有發(fā)現(xiàn)的pandas用法啸如。在這里做一個(gè)總結(jié), 也算是學(xué)習(xí)筆記吧氮惯。本筆記大部分都會(huì)以下面的數(shù)據(jù)作為例子叮雳。另外想暗,推薦大家使用ipython來查看及處理數(shù)據(jù)。

首先看這樣的數(shù)據(jù)帘不。

image.png

這是kaggle上的關(guān)于員工離職的數(shù)據(jù)江滨,現(xiàn)在要根據(jù)滿意度,工作項(xiàng)目厌均, 薪水等指標(biāo)判斷一個(gè)員工是否會(huì)離職唬滑。 在進(jìn)行機(jī)器學(xué)習(xí)之前,我們首先要進(jìn)行數(shù)據(jù)的清理及預(yù)處理棺弊。數(shù)據(jù)下載

1. 查看統(tǒng)計(jì)數(shù)據(jù)

csv文件讀取

拿到數(shù)據(jù)以后晶密,一般都要先看看數(shù)據(jù)長啥樣,有多大模她,都有什么特征稻艰,用pandas查看這些是非常方便的。針對(duì)本例子中的csv文件侈净, 我們使用read_csv函數(shù)來讀取尊勿, 讀進(jìn)來之后是pandas中的DataFrame格式。

import numpy as np
import pandas as pd
# 使用read_csv讀取數(shù)據(jù)
hr = pd.read_csv("HR.csv")

但有一點(diǎn)要注意畜侦,讀取的時(shí)候要先看一下csv文件中格式元扔。主要看兩點(diǎn),一是第一列(也有可能是前幾列)是不是索引旋膳,二是看第一行是數(shù)據(jù)還是feature的名稱澎语。 read_csv方法默認(rèn)會(huì)將第一行當(dāng)成feature來解析。

# 如果第一列是索引
pd.read_csv('data.csv', index_col=0)
# 如果是純數(shù)據(jù)沒有feature的話
pd.read_csv('data.csv', header=None)

實(shí)際上如果你用的是ipython验懊,可以直接輸入 pd.read_csv? 來查看這個(gè)函數(shù)的文檔擅羞,非常方便。

查看數(shù)據(jù)
# 查看數(shù)據(jù)的行數(shù)與列書义图, 一般來說行代表樣本數(shù)减俏, 列代表feature數(shù)
hr.shape
# 查看數(shù)據(jù)的前5行
hr.head()
# 查看每一列的計(jì)數(shù)及數(shù)據(jù)類型等信息
hr.info()
# 查看統(tǒng)計(jì)信息
hr.describe()

一般來說我們都會(huì)看一下這些信息。 從而對(duì)數(shù)據(jù)有一定的概念碱工。

2. 簡單的可視化

   pandas提供了一個(gè)簡單的函數(shù)讓我們可以非常簡單的查看各個(gè)column的分布直方圖娃承,當(dāng)然僅限于該column的值的數(shù)字的時(shí)候,如果是離散值就沒有用這個(gè)辦法可視化了痛垛。值得注意的是該函數(shù)依賴于matplotlib, 須先導(dǎo)入該包匙头。
import matplotlib.pyplot as plt
hr.hist(grid=False, figsize=(12,12))

有兩個(gè)參數(shù)值得一提

grid : True 或者 False漫谷; 就是設(shè)不設(shè)置網(wǎng)格, 這個(gè)就看個(gè)人的需求了
figsize: tuple蹂析;圖的大小舔示, 當(dāng)你繪制的直方圖有多個(gè)時(shí)碟婆, 就設(shè)置大一點(diǎn),這個(gè)多嘗試幾次就好了

至于其他的參數(shù)惕稻,一般來說用的不多竖共, 但如果有需求可以看一下文檔,強(qiáng)烈建議用ipython俺祠,這用就可以直接用 hr.hist? 來查看該函數(shù)的文檔了公给。

3. 去除重復(fù)項(xiàng)

pandas提供了duplicated 函數(shù)供我們查看是否有完全一樣的兩行,也就是重復(fù)的兩行蜘渣,返回的是一個(gè)Boolean值的Series淌铐,重復(fù)項(xiàng)那里就是True,無重復(fù)項(xiàng)的False

# 可以通過df.duplicated()查看是否有重復(fù)項(xiàng)
hr.duplicated(keep="last")

keep: "first", "last", False. 默認(rèn)是"first". 非常重要的參數(shù)蔫缸,first的意思就是重復(fù)項(xiàng)里面第一個(gè)為False腿准, 剩下的事True, last的意思則正好相反拾碌,最后一項(xiàng)是False吐葱, 其他重復(fù)項(xiàng)為True。指定為False則表示把所有重復(fù)項(xiàng)都設(shè)置為True
subset: list, 要檢查重復(fù)的項(xiàng)校翔,默認(rèn)是全部弟跑,也就是兩行完全一樣才判斷為True。 如果只是像查看部分column是否一樣的話就可以用subset這個(gè)參數(shù)了展融。

除了查看重復(fù)的項(xiàng)窖认,我們還可以去除重復(fù)項(xiàng)。drop_duplicates提供了這一功能告希。

hr = hr.drop_duplicates()

keep: "first", "last", False. 默認(rèn)是“first”。 也就是默認(rèn)保留最前面的重復(fù)項(xiàng)烧给,將其他重復(fù)項(xiàng)去除燕偶。“l(fā)ast”則表示保留最后面的重復(fù)項(xiàng)础嫡,將其他重復(fù)項(xiàng)去除指么。False則表示將所有重復(fù)項(xiàng)全部去除。
subset: list榴鼎, 默認(rèn)是全部列伯诬。如果只是要將其中幾列相同就去除的話可以用這個(gè)參數(shù)。
inplace: True or False巫财。 默認(rèn)是False盗似,也就是不修改原來的DataFrame。設(shè)置為True則會(huì)改變?cè)瓉淼腄ataFrame平项。

4. 處理缺失值

缺失值的處理一直是數(shù)據(jù)處理的一個(gè)重點(diǎn)工作赫舒。根據(jù)數(shù)據(jù)的不同會(huì)做出不同的選擇悍及,有用均值填充的,中位數(shù)填充的接癌,用0填充的心赶,甚至直接去除的。再復(fù)雜一點(diǎn)的可以用autoencoder來訓(xùn)練預(yù)測(cè)缺失值缺猛,關(guān)于缺失值的處理可以寫一本厚厚的書了缨叫。這里就簡單的說明一下常見的處理方法。注意我這個(gè)數(shù)據(jù)沒有缺失值荔燎,大家可以找找其他數(shù)據(jù)試一下弯汰。

# 用均值填充
hr.fillna(hr.mean())
# 用中位數(shù)填充
hr.fillna(hr.median())
# 用0填充
hr.fillna(0)

5. 離散的feature處理

包含離散的feature的數(shù)據(jù)無法直接作為輸入進(jìn)行機(jī)器學(xué)習(xí)。例如性別湖雹,男跟女咏闪,例如工資,low摔吏,medium鸽嫂,high。 需要做一個(gè)向量化處理征讲。有人說不能直接用0,1,2來表示嗎据某,例如0表示low,1表示medium诗箍, 2表示high癣籽。emmmm,當(dāng)然不行滤祖。怎么向量化呢筷狼?以該數(shù)據(jù)中的工作崗位與工資為例, 001 表示low 匠童,010表示medium埂材,100表示表示high。

categorical_features = ['sales', 'salary']
hr_cat = pd.get_dummies(hr[categorical_features])
hr = hr.drop(categorical_features, axis=1)
hr = pd.concat([hr, hr_cat], axis=1)

很簡單的代碼汤求,值得一提的事get_dummies這個(gè)函數(shù)俏险。該函數(shù)的作用是將離散的變量轉(zhuǎn)化為向量化,一兩句說不清扬绪,這里只告訴你可以這么處理離散變量竖独,想要細(xì)細(xì)了解看一下文檔就明白了,我把文檔貼過來也沒有意思挤牛。

6. 數(shù)據(jù)歸一化

向量歸一化也是非常重要的莹痢。最常見的歸一化方法有兩種,一種是min-max歸一化,就是每一個(gè)值除以最大值減去最小值的差格二,這樣可以把數(shù)據(jù)歸一化到[0,1]之間劈彪。另一種是z-score標(biāo)準(zhǔn)化,也就是經(jīng)過處理后的數(shù)據(jù)符合標(biāo)準(zhǔn)正態(tài)分布顶猜,即均值為0沧奴,標(biāo)準(zhǔn)差為1。這兩種都非常常見长窄,具體使用哪種得看數(shù)據(jù)滔吠。可以用sklearn來進(jìn)行處理挠日,這樣就不用自己來實(shí)現(xiàn)了疮绷。

from sklearn.preprocessing import StandardScaler
# 使用z-score標(biāo)準(zhǔn)化數(shù)據(jù)
ss = StandardScaler()
scale_features = ['number_project', 'average_monthly_hours', 'time_spend_company']
hr[scale_features] = ss.fit_transform(hr[scale_features])

如果是想用min-max歸一化的話,sklearn也有現(xiàn)有的類實(shí)現(xiàn)嚣潜。

from sklearn.preprocessing import MinMaxScaler
ss = MinMaxScaler()
scale_features = ['number_project', 'average_monthly_hours', 'time_spend_company']
hr[scale_features] = ss.fit_transform(hr[scale_features])

7. 去除缺失比例超過50%的行/列

這是我在處理其他數(shù)據(jù)的時(shí)候遇到的問題冬骚, 就是有時(shí)候并不只是單純的根據(jù)一部分column來去除數(shù)據(jù),而是要根據(jù)缺失比例來進(jìn)行取舍懂算。有可能是缺失比例超過30%只冻,或者70%。我查了一下pandas好像沒有現(xiàn)有的函數(shù)直接實(shí)現(xiàn)的计技。但不打緊喜德,我寫了兩個(gè)函數(shù)來實(shí)現(xiàn)。

  • 去除缺失值比例超過一定程度的列
def drop_col(df, cutoff=0.4):
    n = len(df)
    for column in df.columns:
        cnt = df[column].count()
        if (float(cnt) / n) < cutoff:
            df = df.drop(column, axis=1)
    return df
hr = drop_col(hr)

當(dāng)然本文中數(shù)據(jù)是沒有缺失值的垮媒,因此沒有什么效果舍悯。注意cutoff指的是有數(shù)據(jù)的比例。

  • 去除缺失值超過一定比例的行
def drop_row(df, cutoff=0.8):
    n = df.shape[1]
    for row in df.index:
        cnt = df.loc[row].count()
        if cnt / n < cutoff:
            df = df.drop(row, axis=0)
    return df
hr  = drop_row(hr)

同樣的睡雇,這里的cutoff也是只有數(shù)據(jù)的比例

8. 根據(jù)條件給列數(shù)據(jù)重新賦值

這個(gè)應(yīng)該也是非常常見的功能萌衬。舉個(gè)簡單的例子,現(xiàn)在要把Work_accident中大于2的值改為True入桂,小于等于2的值改為False奄薇。例子要求可能不太合理,但意思應(yīng)該表達(dá)出來了抗愁。這種要求怎么實(shí)現(xiàn)呢。非常簡單呵晚,一句就可以搞定了蜘腌。

hr['Work_accident'] = hr['Work_accident'].apply(lambda x: False if x<2 else True)

如果要求比較復(fù)雜,就不要用匿名函數(shù)了饵隙,自己寫一個(gè)函數(shù)撮珠,然后像上面那樣子就成了。非常簡單的金矛。

大致應(yīng)該講完了常見的數(shù)據(jù)預(yù)處理芯急,如果再工作中遇到新的需求勺届,我會(huì)不定期的更新本文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市娶耍,隨后出現(xiàn)的幾起案子免姿,更是在濱河造成了極大的恐慌,老刑警劉巖榕酒,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胚膊,死亡現(xiàn)場離奇詭異,居然都是意外死亡想鹰,警方通過查閱死者的電腦和手機(jī)紊婉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辑舷,“玉大人喻犁,你說我怎么就攤上這事『位海” “怎么了肢础?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長歌殃。 經(jīng)常有香客問我乔妈,道長,這世上最難降的妖魔是什么氓皱? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任路召,我火速辦了婚禮,結(jié)果婚禮上波材,老公的妹妹穿的比我還像新娘股淡。我一直安慰自己,他們只是感情好廷区,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布唯灵。 她就那樣靜靜地躺著,像睡著了一般隙轻。 火紅的嫁衣襯著肌膚如雪埠帕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天玖绿,我揣著相機(jī)與錄音敛瓷,去河邊找鬼。 笑死斑匪,一個(gè)胖子當(dāng)著我的面吹牛呐籽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼狡蝶,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼庶橱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贪惹,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤苏章,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后馍乙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體布近,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年丝格,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撑瞧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡显蝌,死狀恐怖预伺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曼尊,我是刑警寧澤酬诀,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站骆撇,受9級(jí)特大地震影響瞒御,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜神郊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一肴裙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涌乳,春花似錦蜻懦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒸辆,卻和暖如春征炼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躬贡。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工柒室, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逗宜。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纺讲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子擂仍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容