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