目录: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)