数据分析之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的计算结果 例如中位数 最大值等

 

 

 

 

 

 求每个钻石的库存量:

 

 

 分组与聚合

按照颜色分组:

res.groupby(by='color')

 

 

 只能获得一个对象也可以对多个对象进行分组

 

 

 对分组变量进行统计汇总:

 

 

 

 

 

 读对数据的重命名:

 

 

 练习题:

 

 

 

 

 

 将表头数据进行替换

 

 

 然后在删除第一行数据:

 

 

 获取每个球队的夺冠次数:

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()

 

posted @ 2021-10-18 15:23  查无此人cxc  阅读(62)  评论(0编辑  收藏  举报