缺失值处理:

识别与处理

1 df.isnull()    # 缺失数据项展示为True
2 df.notnull()    # 缺失数据项展示为False
3 df.fillna()    # 填充缺失数据(重要)
4 df.dropna()    # 删除缺失数据项
 1 data05 = pd.read_excel(r'data_test05.xlsx')
 2 data05.head()
 3 data05.isnull()  # 统计每个数据项是否有缺失
 4 data05.isnull().any(axis = 0)  # 统计列字段下是否含有缺失
 5 # 计算各列数据的缺失比例
 6 data05.isnull().sum(axis = 0)/data05.shape[0]
 7 data05.dropna()
 8 
 9 data05.fillna(value=0)  # 将所有的缺失值填充为0(不合理)
10 # 针对不同的缺失值使用合理的填充手段
11 data05.fillna(value = {
12   'gender':data05.gender.mode()[0],  # 众数:可以有一个也可能是多个
13   'age':data05.age.mean(),  # 平均值
14   'income':data05.income.median()  # 中位数
15 }, inplace = True)

数据汇总:

 1 # 透视表功能
 2 pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
 3 
 4 data:指定需要构造透视表的数据集 
 5 values:指定需要拉入“数值”框的字段列表
 6 index:指定需要拉入“行标签”框的字段列表 
 7 columns:指定需要拉入“列标签”框的字段列表 
 8 aggfunc:指定数值的统计函数,默认为统计均值,也可以指定numpy模块中的其他统计函数 
 9 
10 fill_value:指定一个标量,用于填充缺失值 
11 margins:bool类型参数,是否需要显示行或列的总计值,默认为False 
12 dropna:bool类型参数,是否需要删除整列为缺失的字段,默认为True 
13 margins_name:指定行或列的总计名称,默认为All
14   
15 data06 = pd.read_csv(r'diamonds.csv')
16 data06.head()
17 
18 pd.pivot_table(data06, index = 'color', values='price', aggfunc='mean')
19 pd.pivot_table(data06, index = 'color', columns='clarity', values='price', aggfunc='size')

分组与聚合:

 1 import numpy as np
 2 # 通过groupby方法,指定分组变量
 3 grouped = data06.groupby(by = ['color','cut'])
 4 # 对分组变量进行统计汇总
 5 result = grouped.aggregate({'color':np.size, 'carat':np.min, 
 6                             'price':np.mean, 'table':np.max})
 7 
 8 
 9 
10 # 调整变量名的顺序
11 result = pd.DataFrame(result, columns=['color','carat','price','table'])
12 
13 
14 # 数据集重命名
15 result.rename(columns={'color':'counts',
16                        'carat':'min_weight',
17                        'price':'avg_price',
18                        'table':'max_table'}, 
19               inplace=True)

练习题:

 1 # 分析NBA各球队冠军次数及球员FMVP次数
 2 res = pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin')  ### 返回的是一个列表  列表中是当前页面的所有表格数据
 3 type(res)
 4 res
 5 
 6 # 获取有效数据
 7 champion = res[0]
 8 champion
 9 
10 # 处理列字段名称
11 drop方法使用
12 
13 # 针对冠军字段分组
14 champion.groupby('冠军').groups
15 
16 # 获取分组之后的各分组大小
17 champion.groupby('冠军').size()
18 # 获取各组冠军次数
19 champion.groupby('冠军').size().sort_values(ascending=False)  # 升序
20 
21 # 分组字段可以一次性取多个
22 champion.groupby(['冠军', 'FMVP']).size()

 

 

 

 

数据的合并:

 1 pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None)
 2 
 3 objs:指定需要合并的对象,可以是序列、数据框或面板数据构成的列表 
 4 axis:指定数据合并的轴,默认为0,表示合并多个数据的行,如果为1,就表示合并多个数据的列
 5 join:指定合并的方式,默认为outer,表示合并所有数据,如果改为inner,表示合并公共部分的数据 
 6 join_axes:合并数据后,指定保留的数据轴 
 7 ignore_index:bool类型的参数,表示是否忽略原数据集的索引,默认为False,如果设为True,就表示忽略原索引并生成新索引
 8 keys:为合并后的数据添加新索引,用于区分各个数据部分
 9   
10   
11 # 构造数据集df1和df2
12 df1 = pd.DataFrame({
13   'name':['张三','李四','王二'], 
14   'age':[21,25,22], 
15   'gender':['','','']}
16 )
17 df2 = pd.DataFrame({
18   'name':['丁一','赵五'], 
19   'age':[23,22], 
20   'gender':['','']}
21 )
22 # 数据集的纵向合并
23 pd.concat([df1,df2] , keys = ['df1','df2'])  # 加keys参数可以在合并之后看到数据来源
24 
25 pd.concat([df1,df2] , keys = ['df1','df2']).reset_index() 
26 
27 
28 pd.concat([df1,df2] , keys = ['df1','df2']).reset_index().drop(labels ='level_1', axis = 1).rename(columns = {'level_0':'Class'})
29 
30 
31 
32 # 如果df2数据集中的“姓名变量为Name”
33 df2 = pd.DataFrame({
34   'Name':['丁一','赵五'], 
35   'age':[23,22], 
36   'gender':['','']}
37 )
38 # 数据集的纵向合并
39 pd.concat([df1,df2])
40 # concat行合并,数据源的变量名称完全相同(变量名顺序没有要求)

数据的连接:

 1 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'))
 2 
 3 left:指定需要连接的主 right:指定需要连接的辅表
 4 how:指定连接方式,默认为inner内连,还有其他选项,如左连left、右连right和外连outer on:指定连接两张表的共同字段
 5 left_on:指定主表中需要连接的共同字段
 6 right_on:指定辅表中需要连接的共同字段 
 7 left_index:bool类型参数,是否将主表中的行索引用作表连接的共同字段,默认为False right_index:bool类型参数,是否将辅表中的行索引用作表连接的共同字段,默认为False sort:bool类型参数,是否对连接后的数据按照共同字段排序,默认为False 
 8 suffixes:如果数据连接的结果中存在重叠的变量名,则使用各自的前缀进行区分
 9   
10   
11 # 构造数据集
12 df3 = pd.DataFrame({
13   'id':[1,2,3,4,5],
14   'name':['张三','李四','王二','丁一','赵五'],
15   'age':[27,24,25,23,25],
16   'gender':['','','','','']})
17 df4 = pd.DataFrame({
18   'Id':[1,2,2,4,4,4,5], 
19   'score':[83,81,87,75,86,74,88], 
20   'kemu':['科目1','科目1','科目2','科目1','科目2','科目3','科目1']})
21 df5 = pd.DataFrame({
22   'id':[1,3,5],
23   'name':['张三','王二','赵五'],
24   'income':[13500,18000,15000]})
25 
26 # 首先df3和df4连接
27 merge1 = pd.merge(left = df3, 
28                   right = df4, 
29                   how = 'left', 
30                   left_on='id', 
31                   right_on='Id')
32 # 再将连接结果与df5连接
33 merge2 = pd.merge(left = merge1, 
34                   right = df5, 
35                   how = 'left')

matplotlib:

简介:

一个强大的python绘图和数据可视化工具包,数据可视化也是我们数据分析重要环节之一,可以帮助我们分析出很多价值信息,也是数据分析的最后一个可视化阶段

下载:

# python纯开发环境下

pip3 install matplotlib

# anaconda环境下

conda install matplotlib

'''anaconda已经自动帮助我们下载好了数据分析相关的模块,其实无需我们再下载'''

导入:

import matplotlib.pyplot as plt

目标:

1.离散型数据的可视化

2.连续性数据的可视化

3.关系型数据的可视化

4.多图形的组合

饼图的绘制:

# 饼图属于最传统的统计图形之一,几乎随处可见,例如大型公司的屏幕墙、各种年度论坛的演示稿以及各大媒体发布的数据统计报告等;

# 饼图是将一个圆分割成不同大小的楔(扇)形,而圆中的每一个楔形代表了不同的类别值,通常根据楔形的面积大小来判断类别值的差异;

pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, labeldistance=1.1)

# x:指定绘图的数据
# explode:指定饼图某些部分的突出显示,即呈现爆炸式
# labels:为饼图添加标签说明,类似于图例说明
# colors:指定饼图的填充色
# autopct:自动添加百分比显示,可以采用格式化的方法显示
# pctdistance:设置百分比标签与圆心的距离
# labeldistance:设置各扇形标签(图例)与圆心的距离

导入第三方模块:

import matplotlib.pyplot as plt

解决中文乱码情况:

plt.rcParams['font.sans-serif'] = ['SimHei']

实例:

 1 # 构造数据
 2 edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
 3 labels = ['中专','大专','本科','硕士','其他']
 4 explode = [0,0.1,0,0,0]
 5 
 6 # 绘制饼图                                                                              plt.axes(aspect='equal')  # 如果python版本较低可能是扁的需要加该代码   
 7 plt.pie(x = edu,  # 绘图数据
 8         labels=labels,  # 添加教育水平标签
 9         autopct='%.1f%%',  # 设置百分比的格式,这里保留一位小数
10         explode = explode
11        )
12 
13 # 显示图形
14 plt.show()

条形图的绘制:

虽然饼图可以很好地表达离散型变量在各水平上的差异,但其不擅长对比差异不大或水平值过多的离散型变量,因为饼图是通过各扇形面积的大小来比价差异的,面积的比较有时并不直观;

对于条形图而言,对比的是柱形的高低,柱体越高,代表的数值越大,反之亦然;

 1 bar(x, height, width=0.8, bottom=None, color=None, edgecolor=None, tick_label=None, label = None, ecolor=None)
 2 
 3 # x:传递数值序列,指定条形图中x轴上的刻度值 
 4 # height:传递数值序列,指定条形图y轴上的高度
 5 # width:指定条形图的宽度,默认为0.8 
 6 # bottom:用于绘制堆叠条形图 
 7 # color:指定条形图的填充色 
 8 # edgecolor:指定条形图的边框色 
 9 # tick_label:指定条形图的刻度标签 
10 # label:指定条形图的标签,一般用以添加图例
 1 '''垂直条形图'''
 2 import pandas as pd
 3 # 读入数据
 4 GDP = pd.read_excel(r'Province GDP 2017.xlsx')
 5 
 6 # 设置绘图风格(不妨使用R语言中的ggplot2风格)
 7 plt.style.use('ggplot')
 8 # 绘制条形图
 9 plt.bar(x = range(GDP.shape[0]), # 指定条形图x轴的刻度值
10         height = GDP.GDP, # 指定条形图y轴的数值
11         tick_label = GDP.Province, # 指定条形图x轴的刻度标签
12         color = 'steelblue', # 指定条形图的填充色
13        )
14 # 添加y轴的标签
15 plt.ylabel('GDP(万亿)')
16 # 添加条形图的标题
17 plt.title('2017年度6个省份GDP分布')
18 # 为每个条形图添加数值标签
19 for x,y in enumerate(GDP.GDP):
20     plt.text(x,y+0.1,'%s' %round(y,1),ha='center')
21 # 显示图形    
22 plt.show()