龙空技术网

Python数据分析(四)Pandas统计分析基础

热爱分享网络安全知识 81

前言:

现在咱们对“oracle分母为0”都比较重视,咱们都想要了解一些“oracle分母为0”的相关资讯。那么小编同时在网摘上搜集了一些关于“oracle分母为0””的相关资讯,希望我们能喜欢,同学们一起来了解一下吧!

Pandas 概述

Pandas 库最初是由 Wes McKinney 于 2008 年开发设计的,2012 年,Wes McKinn 的同事

Sien Chang 加入开发工作,他们一起开发出了用于数据分析的著名开源 Python 库——pandas。

pandas 基于 numpy、scipy,补充了大量数据操作功能,能实现统计、分组、排序、透视表,可

以代替 excel 的绝大部分功能。pandas 最初是作为金融数据分析工具而开发出来,因此,对时间

序列分析提供了很好的支持。

安装:pip install pandas -i

Pandas 的核心是 2 种重要的数据类型:

Series

Series 类型类似于 Numpy 的一维数组对象,可以将该类型看做是带有标签的一维数组对象

DataFrame

• DataFrame 是一个二维数据类型,我们可以将 DataFrame 理解成类似 excel 的表格型数

据,由多列组成,每个列的类型可以不同。

• 由于 DataFrame 是多维数据类型,因此,DataFrame 既有行索引,也有列索引。

Series 常用操作

创建

pd.Series()

① 列表等可迭代对象

② ndarray 数组对象

③ 字典对象

④ 标量

相关属性

• index

• values

• shape

• size

• dtype

说明:

1. Series对象可以通过index与values访问索引与值。其中,我们

也可以通过修改index属性来修改Series的索引。

2. 如果没有指定索引,则会自动生成从0开始的整数值索引,也可

以使用index显式指定索引。

3. Series对象与index具有name属性。Series的name属性可在创

建时通过name参数指定。

4. 当数值较多时,可以通过head与tail访问前 / 后N个数据。

5. Series对象的数据只能是一维数组类型。

运算

 矢量化运算

多个 Series 运算时,会根据索引进行对齐。当索引无法匹配时,结果值为NaN(缺失

值)

 空值的处理

• 我们可以通过 pandas 或 Series 的 isnull 与 notnull 来判断数据是否缺失。

• 尽管 Numpy 的一些函数,也适用于 Series 类型,但 Series 与 ndarray 数组对于

空值 NaN 的计算处理方式上是不同的。

【Numpy 的计算,会得到 NaN,而 Series 会忽略 NaN】

访问

 标签索引与位置索引:

• loc:通过标签索引访问。

• iloc: 通过位置索引访问。

 整数数组和布尔数组索引:

• 与 ndarray 数组的整数索引不太相同,Series 的整数数组索引,

既可以是标签数组索引,也可以是位置数组索引

访问

 切片:

• 通过位置索引切片,不包含末尾的值,

• 通过标签索引切片,包含末尾的值

增删改

 修改值:索引赋值

 增加值:索引赋值

 删除值

• del :按索引删除,类似于字典操作

• drop:通过多标签,删除多个值;Inplace 参数表示就地修改

DataFrame 常用操作

创建

pd.DataFrame()

 二维数组结构(列表,ndarray数组,DataFrame等)

 字典类型,key 为列名,value 为一维数组结构(列表,ndarray数组,Series等)

说明:

① 我们可以在创建DataFrame 对象时,通过 index 与 columns 参数指定索引

② 如果没有显式指定行与列索引,则会自动生成以 0 开始的整数值索引。

③ 可以通过 head(),tail() 访问前 / 后 N 行记录(数据)

相关属性

 index

 columns

 values

 shape

 ndim

 dtypes

说明:

• 可以通过index访问行索引,columns访问列

索引,values访问数据,其中index与

columns也可以进行设置(修改)。

• 可以为DataFrame的index与columns属性

指定name属性值。

• DataFrame的数据不能超过二维。

增删改查

 访问列

• 访问字典的形式:df["列名"], df[["列1","列n"]]

• 访问属性的形式:df.列名

 访问行:

• 通过标签:df.loc["地区1"],df.loc[["地区1","地区2"]]

• 通过序号:df.iloc[0],df.iloc[[0,3]]

• 通过布尔序列:df[布尔序列]

增删改查

 切片

• 访问行: df.loc["地区1":"地区4"]、 df.iloc[0:3]

• 访问列: df.loc[:,"A":"D"] 、 df.iloc[:,0:3]

• 同时访问行和列: df.iloc[0:4,-3:]、 df.iloc[[0,3],-3:]

• 也支持表达式:df.loc[df.A>0.8,:]

增删改查

 修改:

先定位,然后直接赋值即可,注意是针对原对象的操作

 添加列:

新建一个列索引,并对该索引下的数据进行赋值操作即可

 删除:

df.drop(labels, axis=0, inplace=False)

运算

 转置:df.T

 DataFrame进行运算时,会根据行索引与列索引进行对齐。当索引无法匹配时,

产生空值(NaN)

• 如果不想产生空值,可以使用 DataFrame 提供的运算函数来代替运算符计算,通过

fill_value 参数来指定填充值。

 DataFrame 与 Series 混合运算

• 默认 Series 索引匹配 DataFrame 的列索引,然后进行行广播。可以通过 DataFrame

对象的运算方法的 axis 参数,指定匹配方式(匹配行索引还是列索引)

排序

 索引排序:sort_index ()

 值排序:sort_values()

可以通过 axis 参数来指定排序的方向,

也可以通过 ascending 参数为 True/False 指定升序还是降序

inplace 参数控制是否原地修改

统计描述

 info()

查看数据集的概要信息

统计描述

 describe()

• 对于含有数值型的列,能统计数值列的非空值数目、均值、四分位数和标准差

• 对于不含数值型的列,能统计非空值数目、类别的数目、数目最多的类别和数目最多类别

的数目

统计描述

 常用统计值

读写不同数据源

读文本文件

 read_csv

 read_table

 常用参数

• header

表头信息,None 或者 int 或者 int 列表

• names

指定列名

• index_col

指定当索引的列

• usecols

导入指定列

• sep 、delimiter 分隔符

写文本文件

 to_csv

 常用参数

• sep

分隔符

• header

是否写入标题行,默认为True。

• na_rep

空值的表示

• index

是否写入索引,默认为True。

• index_label

索引字段的名称

• columns

写入的字段,默认为全部写入。

读 Excel 文件

 pandas 提供了 read_excel 函数来读取 xls、xlsx 两种 excel 文件

 需要安装 xlrd 模块:pip install xlrd

写 Excel 文件

 pandas 提供了 to_excel 函数来将数据存储为 Excel 文件

 需要安装 xlwt 模块:pip install xlwt openpyxl

 to_excel 函数和 to_csv 函数的常用参数基本一致,区别之处在于,to_excel 函数指定存

储文件的文件路径参数名称为 excel_writer,并且没有 sep 参数;to_excel 函数增加了一

个 sheetnames 参数,用来指定存储的 excel sheet 的名称,默认为 sheet1。

读写数据库

在生产环境中,绝大多数的数据都存储在数据库中。pandas 提供了读取与存储关系型数据库

数据的函数与方法。除了 pandas 库外,还需要使用 SQLAlchemy 库建立对应的数据库连接。

SQLAlchemy 配合相应数据库的 Python 连接工具(例如,MySQL 数据库需要安装

mysqlclient 或者 pymysql 库,Oracle 数据库需要安装 cx_oracle 库),使用

create_engine 函数,建立一个数据库连接。Pandas 支持 MySQL、postgresql、Oracle、

SQL Server 和 SQLite 等主流数据库。

读数据库

read_sql_table,只能够读取数据库的某一个表格,不能实现查询的操作。

pd.read_sql_table(table_name, con, schema=None, index_col=None,

coerce_float=True, columns=None)

read_sql_query,则只能实现查询操作,不能直接读取数据库中的某个表。

pd.read_sql_query(sql, con, index_col=None, coerce_float=True)

read_sql 是两者的综合,既能够读取数据库中的某一个表,也能够实现查询操作。

pd.read_sql(sql, con, index_col=None, coerce_float=True, columns=None)

读数据库

 pandas 三个数据库数据读取函数的参数几乎完全一致,区别在于传入的是语句还是表名。

写数据库

 pandas 的 to_sql 方法可以将数据写入数据库

df.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, dtype=None)

读写数据库——SQLite

SQLite是一种跨平台的嵌入式数据库,它的数据库就是一个文件。由于 SQLite 本身是

C 语言写的,而且体积很小,占用资源低,处理速度超快,经常被集成到嵌入式产品中,甚至

在 iOS 和 Android 的 App 中都可以集成。

Python 内置了 SQLite3,所以在 Python中 使用 SQLite,不需要安装任何东西,直接使用。

读写数据库——SQLite

读写数据库——SQLite

读写数据库——MySQL

读写数据库——MySQL

安装:pip install pymysql sqlalchemy

数据过滤与转换

数据过滤

可以使用布尔数组来过滤数据

也可以用 DataFrame 类的 query 方法来进行数据过滤

在query方法中也可以使用外面定义的变量,需要在变量前加上@

数据转换

Series 与 DataFrame 对象可以进行行(列)或元素级别的映射转换操作。对于 Series,可

以调用 apply 或 map 方法。对于 DataFrame,可以调用 apply 或 applymap 方法。

 apply:通过函数实现映射转换。【Series传递元素,DataFrame传递行或列。】

 map:对当前Series的值进行映射转换。参数可以是一个Series,一个字典或者是一个函数。

 applymap:通过函数实现元素级的映射转换。

数据转换

Series 含有一个 str 属性,通过 str 能够进行字符串的矢量级运算:

时间序列操作

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

在多数情况下,对时间类型数据进行分析的前提就是将原本为字符串的时间转换为标准时间

类型。pandas继承了 NumPy 库和 datetime 库的时间相关模块,提供了6种时间相关的类。

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

 Timestamp 类型作为时间类中最基础的,也是最为常用的。在多数情况下,时间相关的字

符串都会转换成为 Timestamp。Pandas 提供了 to_datetime 函数,能够实现这一目标。

 注意:Timestamp 类型时间是有范围限制的

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

 除了将其直接转换为 Timestamp

格式外,还可以将数据单独提取出

来将其转换为DatetimeIndex 或者

PeriodIndex。

• DatetimeIndex 是用来指代一系

列时间点的一种数据结构,

• PeriodIndex 则是用来指代一系列

时间段的数据结构。

 pd.DatetimeIndex()

 pd.PeriodIndex()

提取时间序列数据信息

在多数涉及时间相关的数据处理与统计分析的过程中,需要提取时间中的年份,月份等数据。

使用对应的 Timestamp 类属性就能够实现这一目的。

提取时间序列数据信息

 在 DatetimeIndex 和 PeriodIndex 中提取对应信息也是以类属性方式实现。

注意:PeriodIndex 相比于 DatetimeIndex 少了 day_name函数 ,所以不能够用该属性提

取星期名称数据。若想要提取信息名称可以通过提取 weekday 属性,而后将0-6七个标签分

别赋值为 Monday 至 Sunday 。

加减时间数据

 使用 Timedelta ,可以很轻松地实现在某个时间上加减一段时间 。

 除了使用 Timedelta 实现时间的平移外,还能够直接对两个时间序列进行相减,从而得出

一个 Timedelta。

分组与聚合

• 依据某个或者某几个字段对数据集进行分组,并对各组应用一个函数,无论是聚合还是转换,都是数据分析的常用操作。

• Pandas 提供了一个灵活高效的groupby方法,配合 agg 方法或 apply 方法,能

够实现分组聚合的操作。

使用 groupby 方法拆分数据

 DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True,

group_keys=True, squeeze=False, **kwargs)

使用 groupby 方法拆分数据

 by 参数

• 如果传入的是一个函数则对索引进行计算并分组。

• 如果传入的是一个字典或者Series则字典或者Series的值用来做分组依据。

• 如果传入一个NumPy数组则数据的元素作为分组依据。

• 如果传入的是字符串或者字符串列表则使用这些字符串所代表的字段作为分组依据。

使用 groupby 方法拆分数据

用 groupby 方法分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址。

分组后的数据对象 GroupBy 类似 Series 与 DataFrame,是 pandas 提供的一种对象。

GroupBy 对象常用的描述性统计方法如下:

使用 agg 方法聚合数据

 agg、aggregate 方法都支持对每个分组应用某函数,包括 Python 内置函数或自定义函

数。同时,这两个方法也能够直接对 DataFrame 进行函数应用操作,使用格式如下:

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

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

使用 apply 方法聚合数据

 apply 方法类似 agg 方法能够将函数应用于每一列。不同之处在于 apply 方法传入的函数

只能够作用于整个 DataFrame 或者 Series,而无法像 agg 一样能够对不同字段,应用不

同函数获取不同结果。使用格式如下:

• df.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。

透视与交叉表

使用 pivot_table 函数创建透视表

数据透视表是数据分析中常见的工具之一,根据一个或多个键值对数据进行聚合,根据行或列

的分组键将数据划分到各个区域。利用 pivot_table 函数可以实现透视表,使用格式如下:

pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean',

fill_value=None, margins=False, dropna=True, margins_name='All')

使用 pivot_table 函数创建透视表

在不特殊指定聚合函数 aggfunc 时,会默认使用 numpy.mean 进行聚合运算,numpy.mean

会自动过滤掉非数值类型数据。可以通过指定 aggfunc 参数修改聚合函数。

和 groupby 方法分组的时候相同,pivot_table 函数在创建透视表的时候分组键 index 可以有

多个。

通过设置 columns 参数可以指定列分组。

当全部数据列数很多时,若只想要显示某列,可以通过指定 values 参数来实现。

当某些数据不存在时,会自动填充 NaN,因此可以指定 fill_value 参数,表示当存在缺失值时,

以指定数值进行填充。

可以更改 margins 参数,查看汇总数据。

使用 crosstab 函数创建交叉表

交叉表是一种特殊的透视表,主要用于计算分组频率

 pandas.crosstab(index, columns, values=None, rownames=None, colnames=None,

aggfunc=None, margins=False, dropna=True, normalize=False)

标签: #oracle分母为0