Pandas数据结构
pandas有两个基本的数据结构:Series和DataFrame。
1.1 创建Series数据
需要引入pandas模块:import pandas as pd
需要引入Series和DataFrame: from pandas import Series,DataFrame
Series数据:索引在左,值在右
Series有values和index属性,可返还值数据的数据形式和索引对象
Series具有索引对象,可通过其获取Series的单个或者一组值
Series运算都会保留索引和值之间的链接
Series数组中的索引和值一一对应,类似于Python字典数据,所以也可以通过字典数据来创建Series
Series对象和索引都有name属性,这样我们就可以给Series定义名称,让Series更具可读性
1.2 创建DataFrame数据
DataFrame数据有行索引和列索引,行索引类似于Excel表格中每行的编号(没有指定索引的情况下),列索引类似于Excel表格的列名(通常也可称为字段)
由于字典是无序的,因此可以通过columns指定列索引的排列顺序
当没有指定行索引的情况下,会使用0到N-1(N为数据的长度)作为行索引,这里也可以使用其他数据作为行索引。
通过values属性可以将DataFrame数据转换为二维数组。
下表中提供了部分常用的为创建DataFrame数据可传入的数据类型。
1.3 索引对象
Series的索引和DataFrame的行和列索引都是索引对象,用于负责管理轴标签和元数据。
索引对象是不可以进行修改的,如果修改就会报错
二、pandas索引操作
2.1 重新索引
重新索引并不是给索引重新命名,而是对索引重新排序,如果某个索引值不存在的话,就会引入缺失值(NaN)。
对于DataFrame数据来说,行和列索引都是可以重新索引的。
需要对插入的缺失值进行填充的话,可通过method参数来实现,参数值为ffill或pad时为向前填充,参数值为bfill或backfill时为向后填充。
reindex函数的各参数使用说明
2.2 更换索引
在DataFrame数据中,如果不 希望使用默认行索引的话,可 在创建的时候通过index参数来 设置行索引。有时我们希望将 列数据作为行索引,这时可以 通过set_index方法来实现
与set_index方法相反的方法是reset_index(恢复索引)方法
对DataFrame数据,排序之后其行索引会改变
2.3 索引和选取
注意:如果是利用索引标签切片,其尾端是被包含的。
1、 选取列
注意:选取列不能使用切片,因为切片用于选取行数据
2、选取行
注意:获取单独的几行,通过loc和iloc方法可以实现。loc方法是按行索引标签选取数据;iloc方法是按行索引位置选取数据
3、选取行和列
注意:ix方法同时支持索引标签和索引位置来进行行数据的选取,新版的Python中,ix已被废弃,用ix选取行列的方式可以用如下代码代替
4、布尔选择
筛选出性别为female的数据,这时就需要通过布尔选择来完成。
同样也适用于不等于符号(!=)、负号(-)、和(&)、或(|)。
2.4、操作行和列
1、增加 通过append函数传入字典结构数据即可
为一个不存在的列赋值,即可创建一个新列
2、通过drop方法可以删除指定轴上的信息
3、通过rename函数,可完成由于某些原因导致的标签录入错误的问题
三、pandas数据运算
3.1、算数运算
pandas的数据对象在进行算术运算时,如果有相同索引对则进行算术运算,如果没有则会引入缺失值,这就是数据对齐
1、Series数据算术运算
2、DataFrame数据算术运算
3、DataFrame和Series数据在进行运算时,先通过Series的索引匹配到相应的DataFrame列索引上,然后沿行向下运算(广播)。
3.2、函数应用和映射
map函数,将函数套用在Series的每个元素中;
apply函数,将函数套用到DataFrame的行与列上;
applymap函数,将函数套用到DataFrame的每个元素上
1、 需要把price列的“元”字去掉,这时就需要用到map函数
2、apply函数
注意:lambda为匿名函数,和定义好的函数一样,可以节省代码量
3、applymap函数可作用于每个元素,便于对整个DataFrame数据进行批量处理
3.3、排序
1、通过sort_index函数可对索引进行排序,默认情况为升序
2、通过sort_values方法可对值进行排序
pandas排序函数sort_values: pandas中的sort_values()函数原理类似于SQL中的order by,可以将数据 集依照某个字段中的数据进行排序,该函数即可根据指定列数据也可根据指定 行的数据排序。用法如下: DataFrame.sort_values(by=‘##’,axis=0,ascending=True, inplace=False, na_position=‘last’)
3.4、汇总与统计
在DataFrame数据中,通过sum函数可以对每列进行求和汇总
指定轴方向,通过sum函数可按行汇总
describe方法可对每个数值型列进行统计,经常用于对数据的初步观察时使用
count为总数
mean为算数平均数
std为标准差
min为最小值
25%, 50%和75%是对应的四分位数
max为最大值
3.5、唯一值和值计数
在Series中,通过unique函数可以获取不重复的数组。通过values_counts方法可统计每个值出现的次数。
注意:对于DataFrame的列而言,unique函数和value_counts方法同样适用
四、层次化索引
4.1、层次化索引简介
层次化索引就是轴上有多个级别索引
4.2、重排分级顺序
通过swaplevel方法可以对层次化索引进行重排。
4.3、汇总统计
在对层次化索引的pandas数据进行汇总统计时,可以通过level参数指定在某层次上进行汇总统计
五、 pandas可视化
5.1、线形图
Pandas库中的Series和DataFrame中都会有绘制各类图表的plot方法, 默认情况绘制的是线形图。
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib as mpl
import matplotlib.pyplot as plt # 导入matplotlib库
%matplotlib inline
注意: %matplotlib inline为魔法函数,使用该函数绘制的图片会直接显示在Notebook中。
创建一个Series对象
创 建 DataFrame数据。
5.2、柱状图
柱状图常描绘各类别之间的关系
通过pandas绘制柱状图,只需要在plot函数中加入kind=‘bar’,如果类别较多,可绘制水平柱状图(kind=‘barh’)
设置plot函数的stacked参数,可以绘制堆积柱状图。
说明:plot函数的alpha参数可设置颜色透明度。
5.3、直方图和密度图
直方图用于频率分布,y轴可为数值或 者比率。直方图在统计分析中是经常使 用的,绘制数据的直方图,可以看出其 大概分布规律。
通过hist方法绘制直方图
注意:通过设置grid参数可在图表中添加网格 ;bins参数是将值分为多少段,默认为10。
核密度估计(Kernel Density Estimate,KDE)是对真实密度的 估计,其过程是将数据的分布近似为一组核(如正态分布)。
通 过plot函数的kind=‘kde’可进行绘制。
5.4、散点图
散点图主要用来表现数据之间的规律。
绘制散点图,kind='scatter'
小总结:
1、plot方法默认情况,绘制的是线形图;
2、增加参数kind=’bar’或kind=’barh’绘制柱状图或水平柱状图,设置plot的stacked参数可以绘制堆积柱状图;
3、当kind=’kde’可以绘制KDE图,即密度图;
4、当kind=’scatter’可以绘制散点图;
5、还有一个特殊的直方图,使用的是hist方法。
六、综合示例—小费数据集
数据分析的流程通常情况下分为5步。
(1)收集数据。在这一步中,需要对收集的数据有一定的认知,对各字段的 含义和背景知识都要有着足够的理解。
(2)定义问题。根据各自的行业和业务知识,对数据定义多个待解决的问题 。
(3)数据清洗与整理。由于各种问题,获取的数据不够“干净” ,需通过各 种手段对数据进行清洗与整理,以便得到准确的分析结果。
(4)数据探索。通过可视化等手段,对数据进行分析和探索,得出结论。
(5)数据展示。这部分用于输出,或撰写数据分析报告、或汇报给上级、或 绘制PPT
举例:
小费数据集来源于Python第三方库seaborn(用于绘图)中自带 的数据,加载该数据集
注意:head函数会返回前5条数据,也可指定返回数据行数。
1、数据来源:
该小费数据为餐饮行业收集的数据。total_bill列为消费总金额; tip列为小费金额;sex列为顾客性别;smoker列为顾客是否抽 烟;day列为小费的星期;time列为聚餐的时间段;size列为聚 餐人数。
2、定义问题
小费金额与消费总 金额是否存在相关性?性别、是否吸烟、星期几、中/晚餐、聚 餐人数和小费金额是否有一定的关联?小费金额占消费总金额的 百分比服从正态分布?
3、数据清洗
首先对数据进行简单描述,看是否有缺失值或者异常值以及通过打印数据的info信息可以看出每列数据的类型 和缺失值
4、数据探索
分析小费金额和消费总金额是否有关联?
首先对小费金额与消费总金额进行分析,看看它们之间是否有关 联,通过下面代码绘制散点图。
通过上图可以看出,小费金额与消费总金额存在着正相关的关系 ,即小费的金额越多,给的消费也就越多。
分析性别是否和小费金额有一定的关联?
我们再来看看性别不一样是否影响小费的金额。这里使用柱状图 ,通过布尔选择男女性别,对小费数据进行平均后绘制柱状图
从柱状图中可以看出,女性小费金额少于男性小费金额。
分析日期(星期)是否和小费金额有一定的关联?
日期与小费的关 系,由于观察数据时只看到了前5行数据,通过unique函数看下 日期的唯一值有哪些。
从柱状图中可以看出,周六、周日的小费比周四、周五 的小费高。
分析聚餐人数是否和小费金额有一定的关联?
从柱状图中可以看出,聚餐人数越多,小费金额越高