数据分析(三) Pandas整理

Pandas

pandas文件读写

Pandas是Python的第三方库,提供高性能易用的数据类型和分析工具

import pandas as pd

Pandas基于NumPy实现,常与NumPy和Matplotlib一同使用

1.1读取文本文件

使用read_table来读取文本文件

pandas.read_table(filepath_or_buffer, sep=’\t’, header=’infer’, 
names=None, index_col=None, dtype=None, engine=None, nrows=None)

使用read_csv函数来读取csv文件

pandas.read_csv(filepath_or_buffer, sep=’\t’, header=’infer’,
 names=None, index_col=None, dtype=None, engine=None, nrows=None)

参数如下:
在这里插入图片描述
• read_table和read_csv函数中的sep参数是指定文本的分隔符的
o 如果分隔符指定错误,在读取数据的时候,每一行数据将连成一片
• header参数是用来指定列名的,如果是None则会添加一个默认的列名
• encoding代表文件的编码格式
o 常用的编码有utf-8、utf-16、gbk、gb2312、gb18030等
o 如果编码指定错误数据将无法读取,IPython解释器会报解析错误

1.2 文本文件存储

使用to_csv函数实现以csv格式存储

DataFrame.to_csv(path_or_buf=None, sep=,, na_rep=, columns=None, 
header=True, index=True,index_label=None,mode=’w’,encoding=None)

参数如下:
在这里插入图片描述

1.3 读取Excel文件

read_excel函数:读取“xls”“xlsx”两种Excel文件

pandas.read_excel(io, sheetname=0, header=0, index_col=None,
 names=None, dtype=None)

参数如下:
在这里插入图片描述

1.4 Excel文件存储

to_excel方法,其语法格式如下。

DataFrame.to_excel(excel_writer=None, sheetname=None, na_rep=, 
header=True, index=True, index_label=None, mode=’w’, encoding=None) 

• 与to_csv方法的常用参数基本一致
o 区别之处在于指定存储文件的文件路径参数名称为excel_writer
o 增加sheetnames参数以指定存储的Excel sheet名,默认为sheet1
o 没有sep参数

二 Series

2.1 创建Series对象

类似字典key-value,在series中则为index的纵轴标度与对应的values
在这里插入图片描述
在这里插入图片描述
可以由如下类型创建:
• Python列表:index与列表元素个数一致
• 标量值:index表达Series类型的尺寸
• Python字典:键值对中的键是索引index从字典中进行选择操作
• ndarray:索引和数据都可用ndarray创建
• 其他函数:range等

2.2 Series基本操作

• Series类型包括index和values两部分
.index属性获得纵轴索引,.values获得数据值
• Series类型的操作类似ndarray类型
• Series类型的操作类似Python字典类型

index和value如下操作:
在这里插入图片描述

类似ndarray类型

索引方法相同,采用 [ ]
numpy中运算和操作可用于Series类型
可以通过自定义索引的列表进行切片
可以通过自动索引进行切片,如果存在自定义索引,则一同被切片

类似Python字典类型

在这里插入图片描述
Series类型的对齐操作

在这里插入图片描述

2.3 Series小结

在这里插入图片描述

三 DataFrame

DataFrame类型由共用相同索引的一组列组成,可以看成是Series的容器,其结构既有行索引,又有列索引的二维数组
• 行索引:index
• 列索引:columns
在这里插入图片描述

3.1 DataFrame基本操作:

DataFrame创建:

可以由以下类型进行创建:
• 二维ndarray对象
• 由一维ndarray、列表、字典、元组或Series构成的字典
• Series类型
• 其他的DataFrame类型

DataFrame常用属性:

在这里插入图片描述

DataFrame数据查看

  • 对单列数据的访问

以字典访问某一个key的值的方式使用对应的列名,实现单列数据的访问
以属性的方式访问,实现单列数据的访问(不建议使用,易引起混淆)

  • 访问某一列的某几行

单独一列的DataFrame可以视为一个Series
访问一个Series中多个元素的方法

  • 访问多列数据

访问DataFrame多列数据可以将多个列索引名称视为一个列表

  • 对某几行访问
    • 方法一:
      第一个[:]代表获取所有列,第二个[]筛选行,第一个[:]可以省略
    • 方法二:
      head和tail函数可以得到开始或者末尾的多行数据,默认参数为5行

使用loc,iloc访问DataFrame数据

  • loc函数是针对DataFrame索引名称的切片方法

DataFrame.loc[行索引名称或条件, 列索引名称]
如传入的不是索引名称,那么切片操作将无法执行

  • iloc函数是针对DataFrame行索引和列索引的位置的切片方法

DataFrame.iloc[行索引位置, 列索引位置]

  • loc、iloc利用多列的列名或者位置作为一个列表或者数据参数实现多列切片

  • 使用loc,iloc方法可以取出DataFrame中的任意数据

  • 使用loc时,传入的行索引名称如果为一个区间,则前后均为闭区间

  • 使用iloc时,传入的行索引位置或列索引位置为区间时,则为前闭后开区间

  • loc还可以传入表达式,结果会返回满足表达式的所有值

  • 若使用detail.iloc[detail[‘order_id’]==‘458’,[1,5]]读取数据,则会报错,原因在于此处条件返回的为一个布尔值Series,而iloc可以接收的数据类型并不包括Series。根据Series的构成只要取出该Series的values就可以了。

  • 需改为detail.iloc[(detail[‘order_id’]==‘458’).values,[1,5]])。

  • loc更加灵活多变,代码的可读性更高,iloc的代码简洁,但可读性不高。具体在数据分析工作中使用哪一种方法,根据情况而定,大多数时候建议使用loc方法。

使用ix访问DataFrame数据

  • ix方法更像是loc和iloc两种切片方法的融合。ix方法在使用时既
    可以接收索引名称也可以接收索引位置。其使用方法如下。DataFrame.ix[行索引的名称或位置或者条件, 列索引名称或位置]
  • 使用ix方法时有个注意事项,第一条,当索引名称和位置存在部分重叠时,ix默认优先识别名称

DataFrame数据更改

原理:将这部分数据提取出来,重新赋值为新的数据

为DataFrame增添数据

  • 添加一列的方法:
    • 需要新建一个列索引对该索引下的数据进行赋值操作即可 新增的一列值是相同的则直接赋值一个常量即可 删除某列或某行数据:
    • drop函数:
      drop(labels, axis=0, level=None, inplace=False, errors=‘raise’)
      axis为0时表示删除行,axis为1时表示删除列
  • 参数说明:在这里插入图片描述

3.2 numpy中的描述性统计函数

• 数值型数据的描述性统计主要包括
o 最小值、均值、中位数、最大值、四分位数、极差、标准差、方差、协方差和变异系数等
• numpy库中包含一些常用的统计学函数
• pandas库基于numpy,自然也可以用这些函数对DataFrame进行描述性统计
在这里插入图片描述

3.3 Pandas中数值型特征的描述性统计方法

• 提供了更便利的方法来计算均值等,如detail[‘amounts’].mean()
• describe方法
o 能一次性得出DataFrame所有数值型特征的非空值数目、均值、四分位数、标准差
在这里插入图片描述

3.4 DataFrame数据:类别型特征的描述性统计

• 描述类别型特征的分布状况,可以使用频数统计表。pandas库中实现频数统计的方法为value_counts。
• pandas提供了categories类,可以使用astype方法将目标特征的数据类型转换为category类别。
• describe方法除了支持传统数值型以外,还能够支持对category类型的数据进行描述性统计,四个统计量分别为列非空元素的数目,类别的数目,数目最多的类别,数目最多类别的数目。

四 转换与处理时间序列数据

4.1 转换字符串时间为标准时间

• 多数情况:分析时间类型数据进行的前提就是将原本为字符串的时间转换为标准时间类型
• pandas继承了numpy库和datetime库的时间相关模块,提供了6种时间相关的类
在这里插入图片描述

Timestamp类型

• 时间类中最基础的,也是最为常用的
• 在多数情况下,时间相关的字符串都会转换成为Timestamp
o to_datetime函数:实现字符串转换为Timestamp
• 值得注意的是,Timestamp类型时间是有限制的

DatetimeIndex与PeriodIndex函数

• 除了将数据字原始DataFrame中直接转换为Timestamp格式外,还可以将数据单独提取出来将其转换为DatetimeIndex或者PeriodIndex
• 转换为PeriodIndex的时候需要注意,需要通过freq参数指定时间间隔,常用的时间间隔有Y为年,M为月,D为日,H为小时,T为分钟,S为秒。两个函数可以用来转换数据还可以用来创建时间序列数据,其参数非常类似
• 日常使用的过程中,两者区别相对较小DatetimeIndex 是用来指代一系列时间点的一种数据结构 PeriodIndex 则是用来指代一系列时间段的数据结构
在这里插入图片描述

提取时间序列数据信息:Timestamp类常用属性

• 在多数涉及时间相关的数据处理、统计分析的过程中,需提取时间中的年份,月份等数据
在这里插入图片描述
在DatetimeIndex和PeriodIndex中提取信息
• 在DatetimeIndex和PeriodIndex中提取对应信息可以以类属性方式实现
• 值得注意的是PeriodIndex相比于DatetimeIndex少了weekday_name属性,所以不能够用该属性提取星期名称数据。若想要提取信息名称可以通过提取weekday属性,而后将0-6四个标签分别赋值为Monday至Sunday。

加减时间数据:Timedelta类

• 是时间相关类中的一个异类,不仅能使用正数,还能s使用负数表示单位时间
• 使用Timedelta类,配合常规的时间相关类能够轻松实现时间的算术运算
• Timedelta函数中时间周期中没有年和月。所有周期名称,对应单位及其说明如下表所示
在这里插入图片描述
• Timedelta类
o 使⽤Timedelta ,可以很轻松地实现在某个时间上加减⼀段时间
o 除了⽤Timedelta实现时间的平移外,还能直接对两个时间序列进⾏相减,从⽽得出⼀个Timedelta

五 分组聚合与表

5.1 使用分组聚合进行组内计算

使用groupby方法拆分数据

• 提供的是分组聚合步骤中的拆分功能,能根据索引或字段对数据进行分组

DataFrame.groupby(by=None, axis=0, level=None, as_index=True,
sort=True, group_keys=True, squeeze=False, **kwargs)

在这里插入图片描述
by参数的特别说明
o 字符串或者字符串列表:使用这些字符串所代表的字段作为分组依据
o 函数:使用函数对索引进行计算并分组
o 字典或者Series:使用字典或者Series的值用做分组依据
o NumPy数组:使用数组的元素作为分组依据

使用groupby对象常用的描述性统计方法

• 分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址
• 分组后的数据对象GroupBy类似Series与DataFrame
在这里插入图片描述

使用agg方法聚合数据

• agg,aggregate函数都支持对每个分组应用某函数(包括Python内置函数或自定义函数)
• agg,aggregate函数都支持直接对DataFrame进行函数应用操作。
• 一般情况下,agg和aggregate函数对DataFrame对象操作时功能几乎完全相同,

DataFrame.agg(func, axis=0, *args, **kwargs) 
DataFrame.aggregate(func, axis=0, *args, **kwargs)

在这里插入图片描述

使用agg方法聚合数据:求统计量

• 可以使用agg方法一次求出当前数据中所有菜品销量和售价的总和与均值detail[['counts','amounts']].agg([np.sum,np.mean]))

• 对于某个字段希望只做求均值操作,而对另一个字段则希望只做求和操作
o 可以使用字典的方式,将两个字段名分别作为key,然后将NumPy库的求和与求均值的函数分别作为value,如detail.agg({'counts':np.sum,'amounts':np.mean}))

• 在某些时候还希望求出某个字段的多个统计量,某些字段则只需要求一个统计量,此时只需要将字典对应key的value变为列表,列表元素为多个目标的统计量即可,如detail.agg({‘counts’:np.sum,‘amounts’:[np.mean,np.sum]}))

使用agg方法聚合数据:自定义函数

• 在agg方法可传入自定义的函数
o 在agg中可直接使用NumPy库中的函数,如np.mean,np.median,np.sum等
o 但在自定义函数中使用NumPy库中的这些函数,如果计算的时候是单个序列则会无法得出想要的结果,如果是多列数据同时计算则不会出现这种问题。
• 使用agg方法能够实现对每一个字段每一组使用相同的函数
• 如需对不同的字段应用不同函数,则可和Dataframe中使用agg方法相同

使用apply方法聚合数据

• apply方法类似agg方法
• apply与agg比较
o apply传入的函数只能够作用于整个DataFrame或Series
o apply没有agg对不同字段,应用不同函数获取不同结果的功能
o apply方法对GroupBy对象进行聚合操作的方法和agg方法类似
DataFrame.apply(func, axis=0, broadcast=False,
raw=False, reduce=None, args=(), **kwds)
在这里插入图片描述

使用transform方法聚合数据

• transform方法能够对整个DataFrame的所有元素进行操作。且transform方法只有一个参数“func”,表示对DataFrame操作的函数。
• 同时transform方法还能够对DataFrame分组后的对象GroupBy进行操作,可以实现组内离差标准化等操作。
• 若在计算离差标准化的时候结果中有NaN,这是由于根据离差标准化公式,最大值和最小值相同的情况下分母是0。而分母为0的数在Python中表示为NaN

5.2 创建透视表和交叉表

使用povit_table函数创建透视表

• 利用pivot_table函数可以实现透视表,pivot_table()函数的常用参数及其使用格式如下。
在这里插入图片描述
• 在不特殊指定聚合函数aggfunc时,会默认使用numpy.mean进行聚合运算,numpy.mean会自动过滤掉非数值类型数据。可以通过指定aggfunc参数修改聚合函数。
• 和groupby方法分组的时候相同,pivot_table函数在创建透视表的时候分组键index可以有多个。
• 通过设置columns参数可以指定列分组。
• 当全部数据列数很多时,若只想要显示某列,可以通过指定values参数来实现。
• 当某些数据不存在时,会自动填充NaN,因此可以指定fill_value参数,表示当存在缺失值时,以指定数值进行填充。
• 可以更改margins参数,查看汇总数据。

使用crosstab函数创建交叉表

• 交叉表是一种特殊的透视表,主要用于计算分组频率。利用pandas提供的crosstab函数可以制作交叉表,crosstab函数的常用参数和使用格式如下。
• 由于交叉表是透视表的一种,其参数基本保持一致,不同之处在于crosstab函数中的index,columns,values填入的都是对应的从Dataframe中取出的某一列。

pandas.crosstab(index, columns, values=None, rownames=None, colnames=None,
aggfunc=None, margins=False, dropna=True, normalize=False)
在这里插入图片描述

5.3 实例

以餐饮数据为例

• 介绍了数据库数据,csv数据,Excel数据三种常用的数据读取与写入方式
• 阐述了DataFrame的常用属性,方法与描述性统计相关内容。
• 介绍了时间数据的转换,信息提取与算术运算
• 剖析了分组聚合方法groupby的原理,用法和三种聚合方法
• 展现了透视表与交叉表的制作方法

六 Pandas数据预处理

6.1 合并数据

堆叠合并数据:横向堆叠

• 横向堆叠,即将两个表在1轴方向不同的列拼接在一起
• concat函数可以完成横向堆叠,concat函数的基本语法如下。

pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, 
keys=None, levels=None, names=None, verify_integrity=False, copy=True)

在这里插入图片描述
在这里插入图片描述
• 当axis=1的时候,concat做行对齐,然后将不同列名称的两张或多张表合并
• 当两个表索引不完全一样时,可以使用join参数选择是内连接还是外连接
o 在内连接的情况下,仅仅返回索引重叠部分
o 在外连接的情况下,则显示索引的并集部分数据,不足的地方则使用空值填补。
• 当两张表完全一样时,结果都是将两个表完全按照X轴拼接起来,与join参数无关
在这里插入图片描述

堆叠合并数据:纵向堆叠

• 纵向堆叠
o 即将两个表在0轴方向不同的行拼接在一起
• concat函数:
o 在默认情况下,即axis=0时,concat做列对齐,
o 列名并不完全相同的情况下,可使用join参数
o join为inner时,列名取交集,为outer时,列名取并集
o 如果列名相同,则join参数无效
在这里插入图片描述
• append方法
o 实现纵向表堆叠前提条件:两张表的列名需要完全一致
• append方法的基本语法

pandas.DataFrame.append(self, other, ignore_index=False, verify_integrity=False)

在这里插入图片描述

  • 18
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值