Python數(shù)據(jù)處理總結

Python可以很好地完成預處理任務,本文對python常用的numpy & pandas做一些總結。

1. 文本讀寫
python本身就帶有open()函數(shù),配合readline()/write()函數(shù)可以完成讀寫功能。但注意pandas也有很強大的讀寫能力,包括函數(shù)

read_csv()
to_csv()
read_excel()
to_excel()。

這里提一點:read_csv()函數(shù)可以指定index,column name,encoding type,header等等。作者曾經(jīng)遇到過一個比較strange的問題,read_csv()與read_excel()的不同。比如,讀入的第一列是c1,c2,c3,...cn。但是read_csv()的c1前面卻帶了一個未知符號`,即顯示成了`c1。當時調(diào)了半天都沒有明白這個`是怎么產(chǎn)生的,不知道哪位大神能夠解答。最后無奈用read_excel()才解決。

python還有一個叫codecs的模塊,可以很好的解決decode與encode的問題,它可以在讀入時就選擇相應的coding方式。

2. 數(shù)據(jù)處理
這一部分要說的內(nèi)容就太多了,先來簡單區(qū)分一下numpy和pandas。簡單說,pandas是基于numpy的,numpy可以定義array和dataframe,pandas中可以定義dataframe和series。(可能不是很準確)

之前提到的文本讀寫,pandas可以直接將內(nèi)容讀成dataframe或series的形式。同時dataframe和series也可以由list或dictionary生成。這里我的理解是dictionary就是帶有列名的list。

dataframe有一個函數(shù)是astype(),可以修改元素類型。這里要注意一點:當dataframe或series含有null值時,astype(np.float64)或astype(np.int64)將不成功,必須將null值去除后才能convert string into numeric value。去除或者填充null值可以使用dropna()或者fillna()函數(shù)。

強大的lambda函數(shù)

lambda函數(shù)可以應用于map與apply函數(shù)中,對于調(diào)用map與apply的dataframe,可以自動對dataframe做element-wise的操作!!!

關于異常值處理,目前我還只用到了缺失值處理,但不清楚出現(xiàn)異常值,有沒有辦法將它設為0?可以考慮使用lamda函數(shù)。

df['new_col'] = df['old_col'].map( lambda x: func(x) )

map是一個非常強大的函數(shù),這里再舉一個例子,Gender原先有兩個值Male和Female,這里要將其轉為1和0。

df['Gender'] = df['Sex'].map( {'female': 0, 'male': 1} ).astype(int) 

再舉一個例子,有一個dataframe,先需要對其中某幾列做操作,從而得到新的一列,可以用如下方法:

df[new_column] = df.apply(lambda x : func(x[col1],x[col2],...,x[coln])
, axis=1)

根據(jù)以上例子可以發(fā)現(xiàn),lambda函數(shù)中的x可以是某一行,可以是某一列,也可以是某個dataframe。

行列添加與轉置

pandas添加行列以及行列轉換不是特別方便。比如為了實現(xiàn)合并多列數(shù)據(jù)得到一個新的DataFrame,可以使用pd.concat()將多行數(shù)據(jù)合在一起,通過指定參數(shù)axis=1即可按列合并。

但它的一大長處是支持類似sql的基本操作,這點非常強大。

pandas提供了一個類似于關系數(shù)據(jù)庫的連接(join)操作的方法,可以根據(jù)一個或多個鍵將不同DataFrame中的行連接起來語法如下:

merge(left, right, how='inner', on=None, left_on=None, right_on=None,  
      left_index=False, right_index=False, sort=True,  
      suffixes=('_x', '_y'), copy=True, indicator=False) 

用于通過一個或多個鍵將兩個數(shù)據(jù)集的行連接起來,類似于 SQL 中的 JOIN。該函數(shù)的典型應用場景是,針對同一個主鍵存在兩張包含不同字段的表,現(xiàn)在我們想把他們整合到一張表里。在此典型情況下,結果集的行數(shù)并沒有增加,列數(shù)則為兩個元數(shù)據(jù)的列數(shù)和減去連接鍵的數(shù)量。

on=None 用于顯示指定列名(鍵名),如果該列在兩個對象上的列名不同,則可以通過 left_on=None, right_on=None 來分別指定。或者想直接使用行索引作為連接鍵的話,就將 left_index=False, right_index=False 設為 True。

how='inner' 參數(shù)指的是當左右兩個對象中存在不重合的鍵時,取結果的方式:inner 代表交集;outer 代表并集;left 和 right 分別為取一邊。suffixes=('_x','_y') 指的是當左右對象中存在除連接鍵外的同名列時,結果集中的區(qū)分方式,可以各加一個小尾巴。對于多對多連接,結果采用的是行的笛卡爾積。

參數(shù)說明:
left與right:兩個不同的DataFramehow:指的是合并(連接)的方式有inner(內(nèi)連接),left(左外連接),right(右外連接),outer(全外連接);默認為inner on : 指的是用于連接的列索引名稱。必須存在右右兩個DataFrame對象中,如果沒有指定且其他參數(shù)也未指定則以兩個DataFrame的列名交集做為連接鍵left_on:左則DataFrame中用作連接鍵的列名;這個參數(shù)中左右列名不相同,但代表的含義相同時非常有用。

right_on:右則DataFrame中用作 連接鍵的列名left_index:使用左則DataFrame中的行索引做為連接鍵right_index:使用右則DataFrame中的行索引做為連接鍵sort:默認為True,將合并的數(shù)據(jù)進行排序。在大多數(shù)情況下設置為False可以提高性能

suffixes:字符串值組成的元組,用于指定當左右DataFrame存在相同列名時在列名后面附加的后綴名稱,默認為('_x','_y')copy:默認為True,總是將數(shù)據(jù)復制到數(shù)據(jù)結構中;大多數(shù)情況下設置為False可以提高性能indicator:在 0.17.0中還增加了一個顯示合并數(shù)據(jù)中來源情況;如只來自己于左邊(left_only)、兩者(both)

3. 學習模型
python有非常強大的sklearn工作包,已經(jīng)成為最常用的ml工具之一。在sklearn包中,數(shù)據(jù)要求為數(shù)組,而不是pandas的dataframe。

因此經(jīng)過前面的數(shù)據(jù)處理,仍然有兩件事需要完成:

  1. 決定我們需要留下那些列
  2. 將pandas.DataFrame轉化回numpy.array。

在pandas中你可以用.info()方法查看列的類型,或者直接輸入df.dtypes。
若要僅顯示type為object的列:

df.dtypes[df.dtypes.map(lambda x: x=='object')] 

下一步是用drop()去掉我們不用的這些列,用dropna()去除含有缺失值的行,最終的步驟是將其轉化回Numpy數(shù)組:

train_data = df.values

最后來個進階點的問題:

現(xiàn)在我有一個樣本集df,我想將其隨機打亂后抽取其中的N個作為訓練集剩下的作為測試集,該怎么做呢?

答案(http://stackoverflow.com/questions/15923826/random-row-selection-in-pandas-dataframe

參考:
http://blog.csdn.net/u011933487/article/details/38982485
http://blog.csdn.net/zutsoft/article/details/51498026
http://ju.outofmemory.cn/entry/145085
http://stackoverflow.com/questions/13331698/how-to-apply-a-function-to-two-columns-of-pandas-dataframe

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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