利用Python進行數據分析之數據規整化
像我這樣的人
2017閱文超級IP風雲盛典
毛不易
00:00/02:49
數據規整化
重塑和軸向旋轉
對表格型數據重新排列。
重塑層次化索引
stack:將數據的列「旋轉」為行。
unstack:將數據的行「旋轉」為列。
data.stack()結果如下:為一個Series
反過來就是用unstack()
將「長格式」旋轉為「寬格式」
長格式為全部列像關係型資料庫(如MySQL)存儲,固定架構,後續增加數據或者刪除,數據只會越來越長。但是缺點是數據操作不方便。因為都是一行做一個數據,看上去數據就特別多,但是如果將一個作為索引,就能減少一定量的數據級,但是數據量並沒減少。
數據轉換
前面提到的是對數據進行重排,另一類重要操作則是過濾、清理以及其他的
轉換工作。
移除重複操作
DataFrame中出現了重複行時:
利用函數或映射進行數據轉換
假設一個data如下:
如果想添加一列表明該food來源的動物類型,需要先編寫一個肉類到動物的映射:
如何增加上去,注意到有的肉類有大寫,str.lower為一個函數,可以放在Series的map方法中,再把映射也可以放進來:
而使用lambda則更簡潔:
替換值
之前處理缺失時,使用fillna方法填充可以看作是一種特殊情況,前面的map當然也可以用來替換,但是replace是一種更方便靈活的方法。
重命名軸索引
對軸索引重新命名,也可以使用map來傳入一個函數等操作
如果想創建數據集的轉換版而不是修改原始數據,則可以使用rename:
rename不是修改源數據,如果想直接修改,在rename內直接傳入inplace=True即可。
離散化和面元劃分
我的理解就是對一組數據劃分到不同的組內:
假設有一組人員數據,而你希望將它們劃分為不同的年齡組。
接下來將這些數據劃分為「18到25"、"26到35"、"35到60』以及「60以上』幾個面元。要實現該功能.需要使用panda的cut函數:
實際上是先定義一個labels指明每個值分別位於哪個區間(labels),然後對區間進行替換顯示(levels)
默認區間為左開右閉,可以通過
來修改為左閉右開。這個labels負責最後的顯示,所以
如果傳入面元數量(分組數量),則會根據數據最小值和最大值計算等長面元。
qcut是類似cut的函數,但是qcut是使用的樣本分位數,所以得到大小基本相等的面元。即每個面元,每個分組的數據數量基本相同。即將數據均勻撒在四個分組中。
檢測和過濾異常值
排列和隨機採樣
計算指標/啞變數
DataFrame的某一列中含有k個不同的值,則可以派生出一個k列矩陣或DataFrame(其值全為1和0) .pandas有一個get _dummies函數可以實現該功能。
DataFrame列加上一個前綴,abc即變為key_a,key_b,key_c
字元串操作
Python能夠成為流行的數據處理語言,部分原因是其簡單易用的字元申和文本處理功能。大部分文本運算都直接做成了字元串對象的內置方法。對於更為複雜的模式匹配和
文本操作。則可能需要用到正則表達式。pandas對此進行了加強。它使你能夠對整組數據應用字元串表達式和正則表達式.而且能處理煩人的缺失數據。
字元串對象方法
split,strip等這些內置的字元串方法已經滿足來了大部分要求。
利用加法,可以將這些子字元串以雙冒號分隔符的形式連接起來:
但是python則可以直接:
等等,其他內置方法不再贅述。使用時百度查表即可。
正則表達式
正則表達式覺得是一種很高級簡潔的方法,且其他地方用的也很多,如果不了解,建議搜索查看一遍,有所印象。掌握常用的一些用法。
pandas中矢量化的字元串函數
通過data.map,所有字元串和正則表達式方法都能被應用於(傳人lambda表達式或其他函數)各個值,但是如果存在NA就會報錯。為了解決這個問題.Series有一些能夠跳過NA值的字元串操作方法。通過Series的str屬性即可訪問這些方法。例如,我們可以通過str.contains檢查各個電子郵件地址是否含有「gmail":
有兩個辦法可以實現矢量化的元素獲取操作:要麼使用str.get,要麼在str屬性上使用
索引。
矢量化的字元串方法如下:
總結
數據規整化到這章結束,下一步就是數據可視化。
※Python知識點匯總函數例子+模塊使用
※除了畫顆「心」,一行Python代碼還能幹些啥?
TAG:Python |