pandas模块结尾和matplotlib模块

缺失值处理

缺失值的识别与处理

1. df.isnull 
2. df.fillna
3. df.dropna

 

data05 = pd.read_excel(r'data_test05.xlsx')
data05.head()
data05.isnull()  # 统计每个数据项是否有缺失
data05.isnull().any(axis = 0)  # 统计列字段下是否含有缺失

 

 

 

 

 

计算各列数据的缺失比例

data05.isnull().sum(axis = 0)/data05.shape[0]
data05.dropna()

 

 

 

将所有的缺失值填充为0(不合理)

data05.fillna(value=0) 

 

 

 

针对不同的缺失值使用合理的填充手段

data05.fillna(value = {
  'gender':data05.gender.mode()[0],  # 众数:可以有一个也可能是多个
  'age':data05.age.mean(),  # 平均值
  'income':data05.income.median()  # 中位数
}, 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

data06 = pd.read_csv(r'diamonds.csv')
data06.head()

 

 

 

pd.pivot_table(data06, 
         index = 'color',
         values='price',
         aggfunc='mean')
pd.pivot_table(data06,
         index
= 'color',
         columns='clarity',
         values='price',
         aggfunc='size')

 

 

 

 

分组与聚合

import numpy as np
# 通过groupby方法,指定分组变量
grouped = data06.groupby(by = ['color','cut'])
# 对分组变量进行统计汇总
result = grouped.aggregate({'color':np.size, 'carat':np.min, 
                            'price':np.mean, 'table':np.max})

 

 

 

调整变量名的顺序

result = pd.DataFrame(result, columns=['color','carat','price','table'])

数据集重命名

result.rename(columns={'color':'counts',
                       'carat':'min_weight',
                       'price':'avg_price',
                       'table':'max_table'}, 
              inplace=True)

 

实战练习

分析NBA各个球队获得冠军的次数以及球员FMVP次数

res = pd.read_html
('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin')
### 返回的是一个列表 列表中是当前页面的所有表格数据 type(res) res

 

 

获取有效数据

champion = res[0]
champion

 

 

处理列字段名称

drop方法的使用

 

 

 

针对冠军字段分组

champion.groupby('冠军').groups

 

 

获取分组之后的各个分组大小

champion.groupby('冠军').size()

 

 

获取各组冠军次数

champion.groupby('冠军').size().sort_values(ascending=False)  # 升序

 

 

 

 

分组字段可以一次性取多个

champion.groupby(['冠军', 'FMVP']).size()

 

 

 

 

数据的合并

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类型的参数,表示忽略员索引并生成新的索引

keys:为合并忽的数据添加新的索引,用于区分各个数据部分

 

构造数据集df1和df2

df1 = pd.DataFrame({
  'name':['张三','李四','王二'], 
  'age':[21,25,22], 
  'gender':['','','']}
)
df2 = pd.DataFrame({
  'name':['丁一','赵五'], 
  'age':[23,22], 
  'gender':['','']}
)

数据集的纵向合并

pd.concat([df1,df2] , keys = ['df1','df2'])  
# 加keys参数可以在合并之后看到数据来源

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:如果数据连接的结果中存在重叠的变量名,则使用各自的前缀进行区分

 

构造数据集

df3 = pd.DataFrame({
  'id':[1,2,3,4,5],
  'name':['张三','李四','王二','丁一','赵五'],
  'age':[27,24,25,23,25],
  'gender':['','','','','']})
df4 = pd.DataFrame({
  'Id':[1,2,2,4,4,4,5], 
  'score':[83,81,87,75,86,74,88], 
  'kemu':['科目1','科目1','科目2','科目1','科目2','科目3','科目1']})
df5 = pd.DataFrame({
  'id':[1,3,5],
  'name':['张三','王二','赵五'],
  'income':[13500,18000,15000]})

首先将df3和df4连接

merge1 = pd.merge(left = df3, 
                  right = df4, 
                  how = 'left', 
                  left_on='id', 
                  right_on='Id')

 

 

 

再将链接结果与df5连接

merge2 = pd.merge(left = merge1, 
                  right = df5, 
                  how = 'left')

 

 

 

matpoltlib模块

简介

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

下载

python纯开发环境下

pip3 install matpoltlib

anaconda环境下

conda install matplotlib

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

 

导入

import matplotlib.pyplot as plt

 

饼图的绘制

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

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

 

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

 x:指定绘图的数据

explode:指定饼图某些部分的突出线束,及呈现爆炸式

labels:为饼图添加标签说明,类似于图例说明

colors:自动添加百分比显示,可以采用格式化的方法显示

pctdistance:设置百分比标签与圆心的距离

labeldistance:设置各扇形标签(图例)与圆心的距离

导入第三方模块

import matplotlib.pyplot as plt

 

解决中文乱码的情况

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

 

 

 

构造数据

edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中专','大专','本科','硕士','其他']
explode = [0,0.1,0,0,0]

 

绘制饼图

plt.axes(aspect='equal')  # 如果python版本较低可能是扁的需要加该代码 
plt.pie(x = edu,  # 绘图数据
        labels=labels,  # 添加教育水平标签
        autopct='%.1f%%',  # 设置百分比的格式,这里保留一位小数
        explode = explode
       )
# 显示图形
plt.show()

 

 

条形图的绘制

虽然饼图可以很好地表达离散型变量在各水平上的差异,但不擅长对比差异不大或水平价值过多的离散型变量,因为饼图是通过个扇形面积的大小来比较差异的,面积的比较有事并不直观,对于条形图而言,对比的是柱形的高低,柱体越高,代表的数值越大,柱体越低,代表数值越低

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 19:49  ふじわらたくみ  阅读(43)  评论(0编辑  收藏  举报