DataFrame数据操作补充、透视表、分组与聚合、数据的合并纵向和横向和可视化模块matplotlib

DataFrame数据操作补充,透视表分组与聚合 和可视化模块matplotlib

  • pandas其他补充操作
  • 透视表
  • 分组与聚合
  • 数据的合并纵向和横向
  • 可视化模块matplotlib模块
  • 饼图绘制
  • 条形图绘制

 

pandas其他补充操作

缺失值的识别与处理

1. df.isnull  # 判断是否为空
2. df.fillna  # 填充空格
3. df.dropna  # 删除空格

案例

dal=pd.read_excel(r'dal.xlsx')
dal

# 前五个数据
dal.head()

# 统计每个数据项是否有缺失
pla=dal.idnull()
print(pla)
#
统计每列数据数据项是否有缺失 dal.isnull().any(axis=0)

# 计算各列数据的缺失比例
dal.isnull().sum(axis = 0)/dal.shape[0]

# 去除缺失数据
dal.dropna()

d=dal.fillna(value={
     # 众数:以性别中最多的数据为本数据
     'gender':dal.gender.mode()[0],
     # 取age的平均值
     'age':dal.age.mean(),
     #  取工资的中位数
     'income':dal.income.median()
    },
    # 确认更改数
    inplace =True
          )
d

具体问题具体分析

在实际工作中,对不同数据进行不同措施
eg:
    年龄的缺失用平均值填充
    性别用众数填充
    薪资用中位数填充

 

透视表

透视表功能

语法:

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

案例

# 读取d.csv文件数据
dal1=pd.read_csv(r'd.csv')
dal1

输出每个color的price的平均值

pd.pivot_table(
    # 指定数据dl1
    dal1,
    # 指定行表签
    index='color',
    # 指定查找的数值
    values='price',
    # 处理数值的函数
    aggfunc='mean')

 输出所有color中所有clarity的price值

pd.pivot_table(
    # 指定数据dal1
    dal1,
    # 指定行表签
    index='color',
    # 指定列标签
    columns='clarity',
    # 处理数值的函数
    values='price',
    # 选择函数
    aggfunc='size')

 

分组与聚合 

调用模块

import numpy as np

分组

语法:

变量名.groupby(by = [参数])

eg:

获取每个color以cut为单位的数据

gro=dal1.groupby(by = ['color','cut'])
# 输出结果为一个描述性数据
gro

 

聚合函数的运用

语法:

变量.aggregate({'索引单位':处理函数})

eg:

获取分组后的统计汇总

res=gro.aggregate({
                   # 该颜色中的元素有多少个
                   'color':np.size,
                   # carat的最小值
                   'carat':np.min,
                   # price平均值
                   'price':np.mean,
                   # table值的最大值
                   'table':np.max
                   })
res

调整变量名顺序(了解)

语法:

pd.DataFrame(变量, columns=[参数排序])

eg:

调整变量名的顺序

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

 

数据集重命名

语法:

变量.rename(columns={'原名':'新名', '原名':'新名'}, inplace=True)

eg:

res.rename(columns={'color':'num','carat':'weight','price':'avg','table':'max_tab'},
          # 确认修改
          inplace=True  
          )
res

练习题

分析NBA各球队冠军次数及球员FMVP次数

获取数据,返回结果为一个列表

res2=pd.read_html('https://baike.baidu.com/item/NBA%E6%80%BB%E5%86%A0%E5%86%9B/2173192?fr=aladdin')
# 输出数据类型
type(res2)

 输出为:list

 查看数据

res2

获取有效数据

dat=res2[0]
dat

 

drop方法

处理列字段名称,第0行

# 删除第0行
datl.drop(0)
# 获取标题
datl.columns=(['年代','时间','冠军','比分','亚军','FMVP'])
datl

 

分组方法

语法:

变量.groupby('分组索引')

针对冠军字段分组

champion.groupby('冠军').groups

 

获取每个队伍冠军个数

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

 

获取每个队伍冠军个数

datl.groupby('冠军').aggregate({'冠军':np.size})

对数据降序排序,ascending=True为降序,False为升序

datl.groupby('冠军').size().sort_values(ascending=True)

 

获取多个数据

datl.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类型的参数,表示是否忽略原数据集的索引,默认为False,如果设为True,就表示忽略原索引并生成新索引
keys:为合并后的数据添加新索引,用于区分各个数据部分

案例使用

构造数据

d1 = pd.DataFrame({
'name':['一','二','三'],
'age':[3,2,1],
'gender':['男','男','男']}
)
d2 = pd.DataFrame({
'name':['四','五'],
'age':[2,1],
'gender':['男','男']}
)

数据集的纵向合并

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

保留以前的索引,使用reset_index()

pd.concat([d1,d2],keys=['d1','d2']).reset_index()

去除level_1列数据

语法:

变量.drop(columns='列标签')

eg:

pd.concat([d1,d2],keys=['d1','d2']).reset_index().drop(columns='level_1')

纵向合并注意

'''
数据源的变量名称完全相同(变量名顺序没有要求),列数没有要求
'''

eg:

d3 = pd.DataFrame({
  'name':['丁一','赵五'], 
  'age':[23,22], 
  'gender':['',''],
  'hobbey':['yi','er']}
)
# 纵向合并
pd.concat([d1,d3])

横向合并

语法:

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

案例:

数据准备

m1=pd.DataFrame({
    'id':[1,2,3],
    'name':['','','']})
m2=pd.DataFrame({
    'id':[1,2],
    'score':[1,2]
})
m3=pd.DataFrame({
    'id':[1,3]
    'income':[1,3]
})

m1和m2横向合并

heb1=pd.merge(
# 指定主表m1
left=m1,
# 指定附表m2
right=m2,
# 指定主表
how='left',
# 指定主表连结字段
left_on='id',
# 指定附表连结字段
right_on='id'
)
heb1

 

 

 新表与m3合并

heb2=pd.merge(
# 指定主表m1
left=heb1,
# 指定附表m2
right=m3,
# 指定主表
how='left',
# 指定主表连结字段
left_on='id',
# 指定附表连结字段
right_on='id'
)
heb2

 

matplotlib模块

简介

是一个强大的python绘图和数据可视化工具包,数据可视化也是我们数据分析重要环节之一,也是数据分析的最后一个可视化阶段

模块下载

python开发环境下

pip3 install matplotlib -i 网络地址

anaconda环境下

conda install matplotlib -i 网络地址
'''
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:指定饼图的填充色 
autopct:自动添加百分比显示,可以采用格式化的方法显示 
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]

绘制饼图

# 如果python版本较低可能是扁的需要加该代码
plt.axes(aspect='equal')
plt.pie(
# 选择绘图数据
x = edu,
# 添加标签内容
labels=labels,
# 设置百分比的格式,这里保留一位小数
autopct='%.1f%%',
# 获取突出值
explode = explode
)

%matplotlib
# 显示图形
plt.show()

 

 %matplotlib

第一次运行没有结果,第二次运行时删除,可以获取图片模式

 

条形图的绘制

概念

排列在工作表的列或行中的数据可以绘制到条形图中。条形图显示各个项目之间的比较情况。
条形图
使用条形图的情况:
  • 轴标签过长。
  • 显示的数值是持续型的。
  • 数据差异大

语法:

bar(x, y, 
    width=0.8, 
    bottom=None, 
    color=None, 
    edgecolor=None, 
    tick_label=None, 
    label = None, 
    ecolor=None)

参数:

x:传递数值序列,指定条形图中x轴上的刻度值 
y:传递数值序列,指定条形图y轴上的高度
width:指定条形图的宽度,默认为0.8 
bottom:用于绘制堆叠条形图 
color:指定条形图的填充色 
edgecolor:指定条形图的边框色 
tick_label:指定条形图的刻度标签 
label:指定条形图的标签,一般用以添加图例

案例:

调用模块

# 调用模块
import pandas as pd
# 读入数据
GDP = pd.read_excel(r'P.xlsx')

绘制图形

# 设置绘图风格(不妨使用R语言中的ggplot2风格)
plt.style.use('ggplot')
# 绘制条形图
plt.bar(
# 指定条形图x轴的刻度值
x = range(GDP.shape[0]), 
# 指定条形图y轴的数值
        height = GDP.GDP,
# 指定条形图x轴的刻度标签
        tick_label = GDP.Province, 
# 指定条形图的填充色
        color = 'red', 
       )
# 显示图形
plt.show()

如何取消%matplotlib效果

运行方法与matplotlib一样

%matplotlib inline

补充操作

# 添加y轴的标签
plt.ylabel('GDP(万亿)')
# 添加条形图的标题
plt.title('1990年度6个省份GDP分布')
# 为每个条形图添加数值标签
for x,y in enumerate(GDP.GDP):
    # 输入文本数据
    plt.text(
# 所在x轴的位置
x,
# 所在y轴位置的+0.1
y+0.1,
# 显示文本的占位符,四舍五入保留y的一位小数
'%s' %round(y,1),
# 为本位制居中
ha='center')
# 显示图形    
plt.show()

返回目录

posted @ 2021-10-18 21:25  微纯册  阅读(873)  评论(0编辑  收藏  举报