pandas总结

pandas简介

pandas 与 numpy 的主要区别是:

从数据类型上看:

  1. numpy 的核心数据结构是 ndarray,支持任意维数的数组,但要求单个数组内所有数据是同质的,即类型必须相同
  2. pandas 的核心数据结构是 series和dataframe,仅支持一维和二维数据,但数据内部可以是异构数据,仅要求同列数据类型一致即可

1. 从索引上看:

  1. numpy 的数据结构仅支持数字索引
  2. pandas 数据结构则同时支持数字索引标签索引布尔索引

2. 从功能定位上看:

  1. numpy 虽然也支持字符串等其他数据类型,但仍然主要是用于数值计算
  2. pandas 主要用于数据处理与分析,支持包括数据读写、数值计算、数据处理、数据分析和数据可视化全套流程操作

数据结构

1. pandas 共有三种数据结构:

核心数据结构有两种,即一维的 series 和二维的 dataframe,还有一个数据结构是 Index,表示前两者的索引。
两个核心数据结构可以分别看做是在 numpy 一维数组和二维数组的基础上增加了相应的标签信息。正因如此,可以从数组与字典两个角度理解 series 和 dataframe:

  1. series 和 dataframe 分别是一维和二维类数组,因为是类数组,所以numpy中关于数组的用法基本可以直接应用到这两个数据结构,包括数据创建、切片访问、通函数、广播机制等。
  2. series 可以看做是类字典结构:标签是 key, 取值是 value;
    dataframe则可以看做是嵌套字典结构,其中列名是 key,每一 列的 series 是 value。
    所以从这个角度讲, pandas数据创建的一种灵活方式就是 通过字典或者嵌套字典,同时也自然衍生出了适用于 series 和 dataframe 的类似字典访问的接口 df.[‘A’] 获得A列的值一个series ,即通过 loc 索引访问。
    Index数据结构包含 series 中标签列、 dataframe 中行标签和列标签均。既然是数据结构, 就必然有数据类型 dtype 属性,例如数值型、字符串型或时间类型等。

2. 结构的属性:

series 和 dataframe 的属性:

属性 说明
ndim [ndim] 数据维度
shape [ʃeɪp] 数据形状
dtypes 数据类型
size 数据中元素个数
T 转置结果

Index的属性:

属性 说明
index [ˈɪnˌdeks] 行标签
columns [ˈkɒləmz] 列标签
values [ˈvæljuːz] 数据
name 名字属性默认None
shape 形状属性

3. 重构series 和 dataframe 数据结构的方法:

方法 说明
rename 对标签名重命名,也可以重置 index 和 columns 的部分标签列信息,接收标量(用于对标签名重命名)或字典(用于重命名行标签和列标签)
reindex 接收一个新的序列与已有标签列匹配,当原标签列中不存在相应信息时,填充 NAN 或者可选的填充值
set_index/reset_index 互为逆操作,前者是将已有的一列信息设置为签列,而后者是将原标签列归为数据,并重置为默认数字标签

数据读写

文件格式
文本文件,主要包括 csv 和 txt read_csv() to_csv()
Excel 文件,包括 xls 和 xlsx read_excel() to_excel()
SQL 文件 read_sql() to_sql()

此外, pandas 还支持 html、 json 等文件格式的读写操作。

数据访问

series 和 dataframe 兼具 numpy 数组和字典的结构特性,所以数据访问都是从数组和字典这两方面入手。同时,也支持 bool 索引进行数据访问和筛选。
series 和dataframe都可以看做是类字典结构:

  • 在series标签是 key, 元素值是 value;
  • 在dataframe中列名是 key,每一 列的 series 是 value。

那在字典中是如何访问元素值的呢?

dict [ key ] 指向 key 值对应的值 values

  • [ 1 ] 中括号[ ],这是一个非常便捷的访问方式,不过需区分 series dataframe 两种数据结构理解:
    series:既可以用标签也可以用数字索引访问单个元素,还可以用相应的切片访问多个值,因为只有一维信息,自然毫无悬念。
    dataframe:无法访问单个元素,只能返回一列、多列或多行:单值或多值(这里的每一个值都是一个 Series 对象)(多个列名组成的列表)访问时按列进行查询,
    单值访问不存在列名歧义时 还可直接用属性符号" . "访问。
    切片形式访问时按行进行查询,又区分数字切 片和标签切片两种情况:当输入数字索引切片时,类似于普通列表切片;当输入标签切片时,执行范围查询,包含两端 标签结果,无匹配行时返回为空,但要求标签切片类型与索引类型一致。
  • [ 2 ] loc/iloc:
    loc/iloc,最为常用的两种数据访问方法,其中 loc 按标签值访问、 iloc 按数字索引访问,均支持单值访问或切片查询。与[ ]访问类似, loc 按标签访问时也是包含两端结果,但 loc/iloc 比 [ ] 更加灵活。
  • [ 3 ] isin/notin:
    isin/notin,条件范围查询,即根据特定列值是否存在于指定列表返回相应的结果。
  • [ 4 ] where:
    where,仍然是执行条件查询,但会返回全部结果,只是将不满足匹配条件的结果赋值为 NaN 或其他指定值,可用于筛选或屏蔽值

数据处理 :

1. 数据清洗

数据处理中的清洗工作主要包括对空值、重复值和异常值的处理:
①空值

  • [ 1 ] 判断空值, isna 或 isnull,二者等价,用于判断一个 series 或 dataframe 各元素值是否为空的 bool
    结果。需注意对空值的界定:即 None 或 numpy.nan 才算空值,而空字符串、空列表等则不属于空值;类似地, notna
    和 notnull 则用于判断是否非空
  • [ 2 ] 填充空值, fillna,按一定策略对空值进行填充,如常数填充、向前/向后填充等,也可通过 inplace 参数确定是否本地更改
  • [ 3 ] 删除空值, dropna,删除存在空值的整行或整列,可通过 axis 设置,也包括 inplace 参数

②重复值

  • [ 1 ] 检测重复值, duplicated,检测各行是否重复,返回一个行索引的 bool 结果,可通过 keep参数设置保留第一行/最后一行/无保留,例如 keep=first 意味着在存在重复的多行时,首行被认为是合法的而可以保留。
  • [ 2 ] 删除重复值,drop_duplicates,按行检测并删除重复的记录,也可通过keep参数设置保留项。由于该方法默认是按行进行检测,如果存在某个需要需要按 列删除,则可以先转置再执行该方法

③异常值,判断异常值的标准依赖具体分析数据,所以这里仅给出两种处理异常值的可选方法

  • [ 1 ] 删除, drop,接受参数在特定轴线执行删除一条或多条记录,可通过 axis参数设置是按行删除还是按列删除。
  • [ 2 ] 替换, replace,非常强大的功能,对 series 或 dataframe中每个元素执行按条件替换操作,还可开启正则表达式功能。

2. 数值计算

由于 pandas 是在 numpy 的基础上实现的,所以 numpy 的常用数值计算操作在 pandas 中也适用:

  • [ 1 ] 通函数 ufunc,即可以像操作标量一样对 series dataframe 中的所有元素执行同一操作,这与 numpy的特性是一致的。
  • ufunc是 universal function 的缩写,意思是这些函数能够作用于narray对象的每一个元素上,而不是针对narray对象操作,numpy提供了大量的ufunc的函数。这些函数在对narray进行运算的速度比使用循环或者列表推导式要快很多,但请注意,在对单个数值进行运算时,python提供的运算要比numpy效率高。
  • [ 3 ] 广播机制,即当维度或形状不匹配时,会按一定条件广播后计算。由于pandas是带标签的数组,所以在广播过程中会自动按标签匹配进行广播,而非类似 numpy 那种纯粹按顺序进行广播。
  • 字符串向量化,即对于数据类型为字符串格式的一列执行向量化的字符串操作,本质上是调用 series.str 属性的系列接口,完成相应的字符串操作。尤为强大的是,除了常用的字符串操作方法, str属性接口中还集成了正则表达式的大部分功能,这使得 pandas 在处理字符串列时,兼具高效和强力。需注意的是,这里的字符串接口与python 中普通字符串的接口形式上很是相近,但二者是不一样的。
  • [ 4 ] 时间类型向量化操作, 如字符串一样,在 pandas 中另一个得到"优待"的数据类型是时间类型,正如字符串列可用 str属性调用字符串接口一样,时间类型列可用 dt 属性调用相应接口,这在处理时间类型时会十分有效。

3. 数据转换

前文提到,在处理特定值时可用 replace 对每个元素执行相同的操作,然而replace 一般仅能用于简单的替换操作,所以 pandas 还提供了更为强大的数据转换方法

  • [ 1 ] map, 适用于 series 对象,功能与 python 中的普通 map函数类似,即对给定序列中的每个值执行相同的映射操作,不同的是 series 中的 map接口的映射方式既可以是一个函数,也可以是一个字典
  • [ 2 ] apply, 既适用于 series 对象也适用于 dataframe 对象,但对二者处理的元素值是不一样的: apply 应用于series 时是逐元素执行函数操作; apply 应用于 dataframe 时是逐行或者逐列执行函数操作(通过 axis参数设置对行还是对列, 默认是行),仅接收函数作为参数。
  • [ 3 ] applymap, 仅适用于 dataframe 对象,且是对 dataframe 中的每个元素执 行函数操作,从这个角度讲,与eplace 类似, applymap 可看作是 dataframe 对 象的通函数。

4. 合并与拼接

对多个 dataframe 进行合并与拼接,对应 SQL 中两个非常重要的操作: union [ˈjunjən] 和 join [dʒɔɪn] 合并。
pandas 完成这两个功能主要依赖以下函数:

  • [ 1 ] concat,与 numpy 中的 concatenate 类似,但功能更为强大,可通过一个 axis 参数设置拼接方向,要求非拼接轴向标签唯一(例如沿着行进行拼 接时,要求每个 df 内部列名是唯一的,但两个 df 间可以重复,毕竟有相同列才有拼接的实际意义)
  • [ 2 ] merge [mɜrdʒ] 合并,完全类似于 SQL 中的 join语法,仅支持横向拼接,通过设置连接字段,实现对同一记录的不同列信息连接,支持 inner、 left、 right 和outer4种连接方式,但只能实现 SQL 中的等值连接
  • [ 3 ] join,语法和功能与 merge 一致,不同的是 merge 既可以用 pandas 接口 调用,也可以用 dataframe对象接口调用,而 join 则只适用于 dataframe 对象接口
  • [ 4 ] append, concat 执行 axis=0 时的一个简化接口,类似列表的 append 函数 一样 实际上, concat通过设置 axis=1 也可实现与 merge 类似的效果,二者的区别在 于: merge允许连接字段重复,类似一对多或者多对一连接,此时将产生笛卡尔积结 果;而 concat 则不允许重复,仅能一对一拼接。

数据分析

1.基本统计量

pandas 内置了丰富的统计接口,这是与 numpy 是一致的,同时又包括一些常用统计信息的集成接口。

  • [ 1 ] info,展示行标签、列标签、以及各列基本信息,包括元素个数和非空个数及数据类型等
  • [ 2 ] head/tail,从头/尾抽样指定条数记录
  • [ 3 ] describe,展示数据的基本统计指标,包括计数、均值、方差、 4 分位数 等,还可接收一个百分位参数列表展示更多信息
  • [ 4 ] count、 value_counts,
    count 既适用于 series 也适用于 dataframe,用于按列统计个数,实现忽略空值后的计数;
    value_counts 则仅适用于 series,执行分组统计,并默认按频数高低执行降序排列,在统计分析中很有用。
  • [ 5 ] unique、 nunique,也是仅适用于 series 对象,统计唯一值信息,前者返回唯一值结果列表,后者返回唯一值个数(number of unique)
  • [ 6 ] sort_index、 sort_values,既适用于 series 也适用于 dataframe, sort_index是对标签列执行排序,如果是 dataframe 可通过 axis 参数设置是对行标签还是 列标签执行排序; sort_values是按值排序,如果是 dataframe 对象,也可通过 axis 参数设置排序方向是行还是列,同时根据 by参数传入指定的行或者列,可传 入多行或多列并分别设置升序降序参数,非常灵活。另外,在标签列已经命名 的情况下sort_values 可通过 by 标签名实现与 sort_index 相同的效果。

2.分组聚合

pandas 的另一个强大的数据分析功能是分组聚合以及数据透视表,前者堪比SQL 中的 groupby,后者媲美 Excel 中的数据透视表。

  • [ 1 ] groupby,类比 SQL 中的 group by 功能,即按某一列或多列执行分组。一般而言,分组的目的是为了后续的聚合统计,所有 groupby 函数一般不单独使用,而需要级联其他聚合函数共同完成特定需求,例如分组求和、分组求均 值等。 级联其他聚合函数的方式一般有两种:单一的聚合需求用
    groupby+聚合函数 即可,复杂的大量聚合则可借用 agg 函数,agg 函数接受多种参数形式作为聚合函数, 功能更为强大。

  • [ 2 ] pivot, pivot 英文有"支点"或者"旋转"的意思,排序算法中经典的快速排 序就是不断根据 pivot不断将数据二分,从而加速排序过程。用在这里,实际 上就是执行行列重整。例如,以某列取值为重整后行标签,以另一列取值作为重整后的列标签,以其他列取值作为填充 value,即实现了数据表的行列重整。
    另外,还有一对函数也常用于数据重整,即 stack 和 unstack,其中 unstack 执行效果与 pivot 非常类似,而 stack 则是 unstack 的逆过程。

你可能感兴趣的:(数据结构,python)