目錄:html
處理缺失數據app
製做透視圖函數
刪除含空數據的行和列ui
多行索引編碼
使用apply函數spa
本節主要介紹如何處理缺失的數據,能夠參考原文:https://www.dataquest.io/mission/12/working-with-missing-data3d
本節要處理的數據來自於泰坦尼克號的生存者名單,它的數據以下code
pclass,survived,name,sex,age,sibsp,parch,ticket,fare,cabin,embarked,boat,body,home.dest htm 1,1,"Allen, Miss. Elisabeth Walton",female,29,0,0,24160,211.3375,B5,S,2,,"St Louis, MO" blog 1,1,"Allison, Master. Hudson Trevor",male,0.9167,1,2,113781,151.5500,C22 C26,S,11,,"Montreal, PQ / Chesterville, ON" 1,0,"Allison, Miss. Helen Loraine",female,2,1,2,113781,151.5500,C22 C26,S,,,"Montreal, PQ / Chesterville, ON" |
其中,pclass描述的是客艙等級,boat描述的是生存者搭乘的救生艇號碼,body描述的是乘客的屍體編碼。其中age和sex字段都有缺失的數據。因爲不能對缺失數據進行運算,因此要先處理缺失的數據
首先,Pandas會用NaN(not a number)來表示一個缺失的數據,計算age字段爲空的數據有多少行。Pandas有一個函數isnull()能夠直接判斷該列中的哪一個數據爲NaN
import pandas as pd file = ‘titanic_survival.csv’ titanic_survival = pd.read_csv(file) age_null = pd.isnull(titanic_survival[‘age’]) age_null_true = age_null[ age_null == True] age_null_count = len(age_null_true) #計算age字段的平均值 import pandas as pd mean_age = sum(titanic_survival["age"]) / len(titanic_survival["age"]) # mean_age的值爲NaN,由於對NaN數據進行運算,結果也是NaN # 因此要先去除NaN數據 age_null = pd.isnull(titanic_survival["age"]) correct_mean_age = sum(titanic_survival['age'][age_null == False]) / len(titanic_survival['age'][age_null == False])
因爲處理缺失數據很廣泛,因此Pandas使用了一些能夠自動過濾NaN的方法,譬如,mean()方法能夠自動過濾缺失數據並計算平均值
correct_mean_age = titanic_survival["age"].mean()
總結:Pandas處理缺失數據的方法就是先用pd.isnull()來循環判斷某列中的數據是否有空值,而後生成一個只有True或者False的列表,再把該列表中的False值傳進該列中來得出不爲空的數據
可使用數據透視表彙總、分析、瀏覽和顯示數據表數據概覽或 外部數據 源。 數據透視表在您須要合計較大的數字列表時很是有用,聚合後的數據或分類彙總有助於您從不一樣角度查看數據和比較相似數據圖表。
計算每個客艙平均年齡,使用函數pivot_table()
import pandas as pd import numpy as np passenger_age = titanic_survival.pivot_table(index='pclass', values='age', aggfunc=np.mean)
# index參數指明瞭用來分類的列,values標籤指明瞭用來計算的列,aggfunc指明瞭使用什麼函數來計算values指定的列
# 若是要計算男性與女性的平均年齡
passenger_age = titanic_survival.pivot_table(index='sex', values='age', aggfunc=np.mean)
還能夠製做更加複雜的透視圖
譬如,要計算每個客艙等級的平均年齡和費用
import numpy as np # 只要在values參數中增長參數便可 passenger_survival = titanic_survival.pivot_table(index="pclass", values=["age", "fare"], aggfunc=np.mean)
# 一樣地,我要計算每一個客艙等級中,每一個性別的平均年齡和費用,則增長index的參數
passenger_survival = titanic_survival.pivot_table(index=["pclass","sex"], values=["age", "fare"], aggfunc=np.mean)
可使用dropna()函數來刪除具備空數據的行或列
import pandas as pd # 刪除含有空數據的所有行 new_titanic_survival = titanic_survival.dropna() # 能夠經過axis參數來刪除含有空數據的所有列 new_titanic_survival = titanic_survival.dropna(axis=1) # 能夠經過subset參數來刪除在age和sex中含有空數據的所有行 new_titanic_survival = titanic_survival.dropna(subset=["age", "sex"]) print(new_titanic_survival) new_titanic_survival = titanic_survival.dropna(subset=['age', 'body','home.dest'])
這是原始的titanic_survival
在我刪除了那些body列爲NaN的行以後,數據變成了下面這樣
new_titanic_survival = titanic_survival.dropna(subset=["body"])
可見,在new_titanic_survival表中,行的索引仍然保持和以前同樣,並無從新從0開始計算。在上一篇的《Pandas簡易入門(一)》中能夠知道Pandas使用loc[ m ]函數來索引行號爲m的那一行,或者loc[ m: n]來索引行號從m到n(包括n)的那些行,或者loc [[ m, n, o]]來索引行索引號爲m, n, o的行。
可是,在從新生成的new_titanic_suvival中,行的索引號已經變得毫無規律,此時就要使用新的函數iloc[]來按照位置索引
# 輸出新表的前五行 m = new_titanic_survival.iloc[:5,:]
# 輸出新表的第四行,注意仍然從0開始索引,因此在參數中填的是3而不是4 n = new_titanic_survival.iloc[3,:]
假如我想取出新表中第一行,第一列的那個值
m = new_titanic_survival.iloc[0,0] 等價於 n = new_titanic_survival.loc[3,"pclass"]
總結:iloc函數按照所在位置索引(iloc[]中的參數只能爲整型值或者整型的分片),loc函數按照行號和列名索引
參考資料:http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.iloc.html
看過上面就能夠知道使用iloc來索引有多麼的麻煩,實際上能夠對新表進行索引重排序,使用reset_index()函數便可
titanic_reindexed = titanic_survival.dropna(subset=['age', 'boat']).reset_index(drop=True)
# drop函數用來指明是否不把原表中的index值做爲一個新列放進新表
對比上圖就看到行索引進行了重排序,若是drop參數爲False
titanic_reindexed_false = titanic_survival.dropna(subset=['body']).reset_index(drop=False),就會生成以下格式
能夠看到多了名爲index的第一列,該值就是原表中的索引值
以前咱們已經計算了某一列中含有空值的數量,若是我要列出該表每一列中究竟有多少個空值呢,就可使用apply(function)函數,該函數會將自定義的function函數應用在每一列中,而且把運行的結果保存在一個新的Series中,以下
import pandas as pd # 這個函數返回一列中的空值數量 def null_count(column): #首先用isnull函數判斷該列中每一個數值是否爲空,生成一個只有True或者False的向量(列表) column_null = pd.isnull(column) # 把空值的那些數據提取出來,放在一個向量中 null = column[column_null == True] # 返回該向量的長度便可 return len(null) # 對全部的列都運行該函數 column_null_count = titanic_survival.apply(null_count) print(column_null_count)
若是要把函數運行在所有行上,就是用axis參數便可
#對於每一行,假如該行的age字段缺失就顯示unknown,age小於18就返回minor,age大於等於18就返回adult def judge(row): if pd.isnull(row['age']) == True : return 'unknown' return 'minor' if row['age'] < 18 else 'adult' age_labels = titanic_survival.apply(judge, axis=1) print(titanic_survival.columns)