数据分析之pandas模块③
缺失值处理:
现有数据:
res.fillna() 对缺失值进行填充,可以指定value=xxx来填充 但实际不合理
res.dropna() 删除缺失值所在的行
res.isnull() 缺失值返回True或false
统计列字段下是否有数据缺失: res.isnull().any(axis=0)
计算数据缺失比例:res.isnull().sum(axis = 0)/res.shape[0]
针对缺失数据不同的处理方式:
对于该表格,gender字段的缺失 可以用众数填充
res.gender.mode()运行结果如下:
进行索引取值才能填充 res.gender.mode()[0]
对于age字段 可以用平均值填充,因为年龄不受极大值或极小值的影响,否则就要用中位数
对于薪资字段 推荐使用中位数来计算,因为受极大值或极小值的影响:
整体填充的代码为:
res.fillna(value={'gender':res.gender.mode()[0],'age':res.age.mean(),'income':res.income.median()},inplace=True)
最后加上inplace=True 直接修改原表数据
数据汇总
透视表功能
现有数据
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
data:指定需要构造透视表的数据集
values:指定需要写入的数值框的字段列表
index:指定需要拉入行标签的字段列表
columns:指定需要拉入列标签的字段列表
aggfunc:指定数值的统计函数,默认为统计均值,也可以指定numpy模块中的其他统计函数
fill_value:指定一个标量,用于填充缺失值
margins:bool类型参数,是否需要显示行或列的总计值,默认为False
dropna:bool类型参数,是否需要删除整列为缺失的字段,默认为True
margins_name:指定行或列的总计名称,默认为All
res.head ()如果不写参数 默认读五行
pd.pivot_table(res, index = 'color', values='price', aggfunc='mean')
也可以计算其他numpy的计算结果 例如中位数 最大值等
求每个钻石的库存量:
只能获得一个对象也可以对多个对象进行分组
对分组变量进行统计汇总:
读对数据的重命名:
练习题:
将表头数据进行替换
然后在删除第一行数据:
获取每个球队的夺冠次数:
res1 = champion.groupby(by='冠军').aggregate({'冠军':np.size}) res1
获取每个球队的夺冠次数和球员FMVP:
res2 = champion.groupby(['冠军','FMVP']).aggregate({'冠军':np.size}) res2
获取各组冠军次数(升序/降序):
champion.groupby('冠军').size().sort_values(ascending=False) # 升序
res3=champion.groupby('冠军').size().sort_values(ascending=True) #降序
分组字段可以一次性取多个:
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None) objs:指定需要合并的对象,可以是序列、数据框或面板数据构成的列表 axis:指定数据合并的轴,默认为0,表示合并多个数据的行,如果为1,就表示合并多个数据的列 join:指定合并的方式,默认为outer,表示合并所有数据,如果改为inner,表示合并公共部分的数据 join_axes:合并数据后,指定保留的数据轴 ignore_index:bool类型的参数,表示是否忽略原数据集的索引,默认为False,如果设为True,就表示忽略原索引并生成新索引 keys:为合并后的数据添加新索引,用于区分各个数据部分
构造数据集:
df1 = pd.DataFrame({ 'name':['张三','李四','王二'], 'age':[21,25,22], 'gender':['男','女','男']} ) df2 = pd.DataFrame({ 'name':['丁一','赵五'], 'age':[23,22], 'gender':['女','女']} )
数据集纵向合并:
pd.concat([df1,df2] , keys = ['df1','df2']).reset_index() pd.concat([df1,df2] , keys = ['df1','df2']).reset_index().drop(labels ='level_1', axis = 1).rename(columns = {'level_0':'Class'})
如果df2数据集中的"姓名"变量为Name:
df2 = pd.DataFrame({ 'Name':['丁一','赵五'], 'age':[23,22], 'gender':['女','女']} )
# 数据集的纵向合并 pd.concat([df1,df2])
结论:
concat行合并,数据源的变量名称需完全相同
数据的连接:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y')) left:指定需要连接的主 right:指定需要连接的辅表 how:指定连接方式,默认为inner内连,还有其他选项,如左连left、右连right和外连outer on:指定连接两张表的共同字段 left_on:指定主表中需要连接的共同字段 right_on:指定辅表中需要连接的共同字段 left_index:bool类型参数,是否将主表中的行索引用作表连接的共同字段,默认为False right_index:bool类型参数,是否将辅表中的行索引用作表连接的共同字段,默认为False sort:bool类型参数,是否对连接后的数据按照共同字段排序,默认为False suffixes:如果数据连接的结果中存在重叠的变量名,则使用各自的前缀进行区分
构造数据:
使用到merge方法:
然后在进行df5连接'
merge2 = pd.merge(left = merge1, right = df5, how = 'left')
数据分析三剑客之matplotlib板块
导入模块:
饼图的绘制:
饼图属于最传统的统计图形之一,几乎随处可见,例如大型公司的屏幕墙、各种年度论坛的演示稿以及各大媒体发布的数据统计报告等;
饼图是将一个圆分割成不同大小的楔(扇)形,而圆中的每一个楔形代表了不同的类别值,通常根据楔形的面积大小来判断类别值的差异;
关键字 pie
pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, labeldistance=1.1)
x:指定绘图数据
explode:指定饼图某些部分的突出显示,即呈现爆炸式
labels:为饼图添加标签说明,类似于图例说明
colors:指定饼图的填充色
autopct:自动添加百分比显示,可以采用格式化的方法显示
pctdistance:设置百分比标签与圆心的距离
labeldistance:设置各扇形标签(图例)与圆心的距离
第一步:制作饼图
第二步:添加教育水平标签 由于出现了乱码 所以一般在构造图形时会在前面加上一段代码
绘制柱状图:
虽然饼图可以很好地表达离散型变量在各水平上的差异,但其不擅长对比差异不大或水平值过多的离散型变量,因为饼图是通过各扇形面积的大小来比价差异的,面积的比较有时并不直观;
对于条形图而言,对比的是柱形的高低,柱体越高,代表的数值越大,反之亦然;
bar(x, height, width=0.8, bottom=None, color=None, edgecolor=None, tick_label=None, label = None, ecolor=None)
x:传递数值序列,指定条形图中x轴上的刻度值 height:传递数值序列,指定条形图y轴上的高度 width:指定条形图的宽度,默认为0.8 bottom:用于绘制堆叠条形图 color:指定条形图的填充色 edgecolor:指定条形图的边框色 tick_label:指定条形图的刻度标签 label:指定条形图的标签,一般用以添加图例
'''垂直条形图''' import pandas as pd # 读入数据 GDP = pd.read_excel(r'Province GDP 2017.xlsx') # 设置绘图风格(不妨使用R语言中的ggplot2风格) plt.style.use('ggplot') # 绘制条形图 plt.bar(x = range(GDP.shape[0]), # 指定条形图x轴的刻度值 height = GDP.GDP, # 指定条形图y轴的数值 tick_label = GDP.Province, # 指定条形图x轴的刻度标签 color = 'steelblue', # 指定条形图的填充色 ) # 添加y轴的标签 plt.ylabel('GDP(万亿)') # 添加条形图的标题 plt.title('2017年度6个省份GDP分布') # 为每个条形图添加数值标签 for x,y in enumerate(GDP.GDP): plt.text(x,y+0.1,'%s' %round(y,1),ha='center') # 显示图形 plt.show()