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