以下内容为自己在蓝桥云课所学习,用这种方式来进行复习,同时方便自己日后使用时查阅。
介绍
Pandas 是非常著名的开源数据处理库,我们可以通过它完成对数据集进行快速读取、转换、过滤、分析等一系列操作。除此之外,Pandas 拥有强大的缺失数据处理与数据透视功能,可谓是数据预处理中的必备利器。
知识点
数据类型
Pandas 的数据类型主要有以下几种,它们分别是:Series(一维数组),DataFrame(二维数组),Panel(三维数组),Panel4D(四维数组),PanelND(更多维数组)。其中 Series 和 DataFrame 应用的最为广泛,几乎占据了使用频率 90% 以上。
Series
Series是 Pandas 中最基本的一维数组形式。其可以储存整数、浮点数、字符串等类型的数据。Series 基本结构如下:
pandas.Series(data=None, index=None)
其中,data可以是字典,或者NumPy 里的 ndarray 对象等。index是数据索引,索引是 Pandas 数据结构中的一大特性,它主要的功能是帮助我们更快速地定位数据。
由于 Pandas 基于 NumPy 开发。那么 NumPy 的数据类型ndarray多维数组自然就可以转换为 Pandas 中的数据。而 Series 则可以基于 NumPy 中的一维数据转换。
如上所示,我们给出了 NumPy 生成的一维随机数组,最终得到的 Series 索引默认从 0 开始,而数值类型为float64。
DataFrame
DataFrame 是 Pandas 中最为常见、最重要且使用频率最高的数据结构。DataFrame 和平常的电子表格或 SQL 表结构相似。你可以把 DataFrame 看成是 Series 的扩展类型,它仿佛是由多个 Series 拼合而成。它和 Series 的直观区别在于,数据不但具有行索引,且具有列索引。
DataFrame 基本结构如下:
pandas.DataFrame(data=None, index=None, columns=None)
区别于 Series,其增加了columns列索引。DataFrame 可以由以下多个类型的数据构建:
例如,我们首先使用一个由 Series 组成的字典来构建 DataFrame。
当不指定索引时,DataFrame 的索引同样是从 0 开始。我们也可以直接通过一个列表构成的字典来生成 DataFrame。
或者反过来,由带字典的列表生成 DataFrame。
NumPy 的多维数组非常常用,同样可以基于二维数值来构建一个 DataFrame。
至此,你应该已经清楚了 Pandas 常用的 Series 和 DataFrame 数据类型。Series 实际上可以被初略看出是只有 1 列数据的 DataFrame。当然,这个说法不严谨,二者的核心区别仍然是 Series 没有列索引。你可以观察如下所示由 NumPy 一维随机数组生成的 Series 和 DataFrame。
数据读取
我们想要使用 Pandas 来分析数据,那么首先需要读取数据。大多数情况下,数据都来源于外部的数据文件或者数据库。Pandas 提供了一系列的方法来读取外部数据,非常全面。下面,我们以最常用的 CSV 数据文件为例进行介绍。
读取数据 CSV 文件的方法是pandas.read_csv(),你可以直接传入一个相对路径,或者是网络 URL。
df = pd.read_csv("https://labfile.oss.aliyuncs.com/courses/906/los_census.csv")
基本操作
通过上面的内容,我们已经知道一个 DataFrame 结构大致由 3 部分组成,它们分别是列名称、索引和数据。
接下来,我们就学习针对 DataFrame 的基本操作。本次课程中,我们不会刻意强调 Series,因为你在 DataFrame 上学习的大多数方法和技巧都适用于对 Series 进行处理,二者同根同源。
上面,我们已经读取了一个外部数据,这是洛杉矶的人口普查数据。有些时候,我们读取的文件很大。如果全部输出预览这些文件,既不美观,又很耗时。还好,Pandas 提供了head()和tail()方法,它可以帮助我们只预览一小块数据。
Pandas 还提供了统计和描述性方法,方便你从宏观的角度去了解数据集。describe()相当于对数据集进行概览,会输出该数据集每一列数据的计数、最大值、最小值等。
Pandas 基于 NumPy 开发,所以任何时候你都可以通过.values将 DataFrame 转换为 NumPy 数组。
这也就说明了,你可以同时使用 Pandas 和 NumPy 提供的 API 对同一数据进行操作,并在二者之间进行随意转换。这就是一个非常灵活的工具生态圈。
除了.values,DataFrame 支持的常见属性可以通过查看。其中常用的有:
数据选择
在数据预处理过程中,我们往往会对数据集进行切分,只将需要的某些行、列,或者数据块保留下来,输出到下一个流程中去。这也就是所谓的数据选择,或者数据索引。
由于 Pandas 的数据结构中存在索引、标签,所以我们可以通过多轴索引完成对数据的选择。
基于索引数字选择
当我们新建一个 DataFrame 之后,如果未自己指定行索引或者列对应的标签,那么 Pandas 会默认从 0 开始以数字的形式作为行索引,并以数据集的第一行作为列对应的标签。其实,这里的「列」也有数字索引,默认也是从 0 开始,只是未显示出来。
所以,我们首先可以基于数字索引对数据集进行选择。这里用到的 Pandas 中的方法。该方法可以接受的类型有:
整数。例如:5整数构成的列表或数组。例如:[1, 2, 3]布尔数组。可返回索引值的函数或参数。
下面,我们使用上方的示例数据进行演示。
首先,我们可以选择前 3 行数据。这和 Python 或者 NumPy 里面的切片很相似。
那么选择多行,是不是df.iloc[1, 3, 5]这样呢?
答案是错误的。df.iloc[]的[[行],[列]]里面可以同时接受行和列的位置,如果你直接键入df.iloc[1, 3, 5]就会报错。
所以,很简单。如果你想要选择 2,4,6 行,可以这样做。
基于标签名称选择
除了根据数字索引选择,还可以直接根据标签对应的名称选择。这里用到的方法和上面的iloc很相似,少了个i为。
df.loc[]可以接受的类型有:
单个标签。例如:2或'a',这里的2指的是标签而不是索引位置。列表或数组包含的标签。例如:['A', 'B', 'C']。切片对象。例如:'A':'E',注意这里和上面切片的不同之处,首尾都包含在内。布尔数组。可返回标签的函数或参数。
下面,我们来演示df.loc[]的用法。先选择前 3 行:
数据删减
虽然我们可以通过数据选择方法从一个完整的数据集中拿到我们需要的数据,但有的时候直接删除不需要的数据更加简单直接。Pandas 中,以.drop开头的方法都与数据删减有关。
可以直接去掉数据集中指定的列和行。一般在使用时,我们指定labels标签参数,然后再通过axis指定按列或按行删除即可。当然,你也可以通过索引参数删除数据,具体查看官方文档。
则通常用于数据去重,即剔除数据集中的重复值。使用方法非常简单,默认情况下,它会根据所有列删除重复的行。也可以使用 subset 指定要删除的特定列上的重复项,要删除重复项并保留最后一次出现,请使用 keep='last'。
数据填充
既然提到了数据删减,反之则可能会遇到数据填充的情况。而对于一个给定的数据集而言,我们一般不会乱填数据,而更多的是对缺失值进行填充。
在真实的生产环境中,我们需要处理的数据文件往往没有想象中的那么美好。其中,很大几率会遇到的情况就是缺失值。缺失值主要是指数据丢失的现象,也就是数据集中的某一块数据不存在。除此之外、存在但明显不正确的数据也被归为缺失值一类。例如,在一个时间序列数据集中,某一段数据突然发生了时间流错乱,那么这一小块数据就是毫无意义的,可以被归为缺失值。
检测缺失值
Pandas 为了更方便地检测缺失值,将不同类型数据的缺失均采用NaN标记。这里的 NaN 代表 Not a Number,它仅仅是作为一个标记。例外是,在时间序列里,时间戳的丢失采用NaT标记。
Pandas 中用于检测缺失值主要用到两个方法,分别是:和,故名思意就是「是缺失值」和「不是缺失值」。默认会返回布尔值用于判断。
接下来,我们人为生成一组包含缺失值的示例数据。
然后,通过或中的一个即可确定数据集中的缺失值。
上面已经对缺省值的产生、检测进行了介绍。实际上,面对缺失值一般就是填充和剔除两项操作。填充和清除都是两个极端。如果你感觉有必要保留缺失值所在的列或行,那么就需要对缺失值进行填充。如果没有必要保留,就可以选择清除缺失值。
其中,缺失值剔除的方法dropna()已经在上面介绍过了。下面来看一看填充缺失值fillna()方法。
首先,我们可以用相同的标量值替换NaN,比如用0。
最后一行由于没有对于的后序值,自然继续存在缺失值。
上面的例子中,我们的缺失值是间隔存在的。那么,如果存在连续的缺失值是怎样的情况呢?试一试。首先,我们将数据集的第 2,4 ,6 列的第 3,5 行也置为缺失值。
对 C 列到 E 列用平均值填充
插值填充
插值是数值分析中一种方法。简而言之,就是借助于一个函数(线性或非线性),再根据已知数据去求解未知数据的值。插值在数据领域非常常见,它的好处在于,可以尽量去还原数据本身的样子。
我们可以通过方法完成线性插值。当然,其他一些插值算法可以阅读官方文档了解。
对于支持的插值算法,也就是method=。下面给出几条选择的建议:
如果你的数据增长速率越来越快,可以选择method='quadratic'二次插值。如果数据集呈现出累计分布的样子,推荐选择method='pchip'。如果需要填补缺省值,以平滑绘图为目标,推荐选择method='akima'。
当然,最后提到的method='akima',需要你的环境中安装了 Scipy 库。除此之外,method='barycentric'和method='pchip'同样也需要 Scipy 才能使用。