Python的pandas模块功能强大,包含大量用于分析数据结构的函数。它依赖于NumPy库。pandas的设计初衷是降低数据分析操作的难度,提升速度。比起Python的标准函数, pandas函数性能更高,尤其擅长文件读写、数据库操作; pandas是数据处理的最佳选择。探索数据所包含的信息,主要方法有哪些以及如何用pandas进行操作,下面几节将给出答案。我们先讲解数据在pandas中的存储形式和数据的加载方法。

import pandas as pd

1·探索数据

我们先介绍pandas只有一维的数组类对象Series ,以此引入pandas的数据库结构DataFrame, Series可以存储NumPy所有类型的数据,同时还存储数据的标签-索引。我们来看一个简单的例子:




dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断


obj对象由两类值组成,右侧为元素,左侧为元素对应的索引。给定元素数组的长度为N,索引则默认从0排到N-1. Series的元素数组和索引对象,可分别用values和index属性获取:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_02


NumPy数组运算,索引会予以保留(例如标量乘法、用布尔数组过滤或用数学函数处理数组):


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_03


Python字典可转换为series对象,但是字典的键被转换为索引:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_04


也可以用单独的列表作为索引:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_05


上述例子,最后一个索引g ,没有对应的元素,因此pandas默认插入NaN ( Not a Number ,非数字)。我们用缺失值或NAN来指代缺失的数据。用pandas的isnull和notnull函数,可找出缺失值:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_06


现在,我们可以从一个CSV文件导入数据到DataFrame结构。DataFrame这种数据结构,有一组按顺序排列的列,每一列可以是不同的数据类型(数值、字符串、布尔值等), DataFrame有两种索引(行、列索引)。我们也可以将DataFrame看成一个由Series对象组成的字典,每个Series里面,所有元素的索引相同(列的标题)。下面我们结合ad.data文件中的数据进行讲解,该数据可从

http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements下载。在前面机器学习的例子已介绍过。">http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements下载。在前面机器学习的例子已介绍过。

在终端输入以下代码导入数据(该例中,数据文件的路径为data_example/ad-dataset/ad. data) :

In [4]: data =pd.read_csv("data_example/ad-dataset/ad.data", header=None)

该文件没有标题行(故将header参数设置为none ) ,因此使用数字作为各列的名称。在data对象上调用describe函数,可得到DataFrame的各种总描述性统计信息:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_07


上面总结了几种定量信息。由此可见,该数据集总共有1554个数值类型的列(因为没有标题行,列的名称用数字表示)、3279行(对每一列调用count函数)。每一列都有一组统计指标(均值、标准差、最小值、最大值和分位数) ,这些统计数据有助于我们对DataFrame中数据的定量信息做出初步估计。

用columns属性可获取到所有列的名称:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_08


所有列的名称为int64类型,下述命令返回所有列的实际数据类型:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_09


前4列和标签列(最后1例)为object类型,其余为int64类型。列的访问方法有两种。第1种,指定列的名称,与指定字典的键相似:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_10


用列表形式,指定多个列名称,可获取到多列:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_11


另一种访问列的方法是点号句法,这只有在列名称也是Python变量(中间没有空格) ,没有重名的DataFrame属性或函数(比如count或sum ) ,并且列名称还必须是字符串类型时,才能使用该方法(该例中,列名称为int64类型,因此不能用此方法)。

若想对DataFrame中的内容有一个大致的了解,可使用head()函数。它默认返回一列的前5个元素(或DataFrame的前5行) :


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_12


当然也可以用tail()函数,它默认返回最后5个元素或5行。在head()或tail()函数中指定数字n,将返回所选列的前、后n个元素:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_13


用python的标准切片句法,也可以从DateFrame中获取到一定数量的行:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_14


上述代码仅获取到DateFrame的前两行(当然还有标题)。

2. 操作数据

行的选取方法有多种,比如指定索引或按条件选取:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_15


或者,按多个条件选取数据:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_16


上面返回的数据为特征1大于0且包含广告的网页。

Ix方法通过指定索引来选择相应的行:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_17


此外,也可以使用iloc函数:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_18


ix和iloc的不同点在于,操作的是索引列标签的名称,而iloc操作的是索引的位置(因此它只能接收整数)。因此,上述例子, ix一直找到标签3出现为止(共4行) ,而iloc函数返回DatarFrame的前3行。访问DataFrame内部数据,还有一个函数叫作loc ,它查找索引列的标签名,返回相应的行,例如:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_19


注意该函数与Python的标准切片方法不同,因为结果包括起始和结束位置的行(该例中,输出结果包含索引为3的行)

再来看其他操作。DataFrame对象的一整列可设置为同一个值:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_20


也可以将指定的单元格设置为我们想要的值:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_21


或将整行设置为一组值(该例使用随机数0或1和ad.标签)。


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_22


数组转换为series对象后,可作为新的一行追加到DatarFrame的末尾:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_23


用loc函数可在DatarFrame最后增加一行:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_24


追加列则非常简单,将元素赋给DatarFrame新的列即可:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_25


上述例子,新增的列所有元素的值为test value。删除列,可用drop函数:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_26


出于多种原因,数据集也许包含重复数据。Pandas的duplicated方法可判断每一行是否是对其他行的重复:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_27


Drop_duplicates函数比duplicated函数更强大,它返回的DataFrame仅包含去重过后剩余的所有元素。例如,使用该函数,我们可以找出标签这一列两个不同的元素是:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_28


我们还可以方便地将上述结果转换为列表:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_29


我们可以把标签转换为数值,前面机器学习示例一节讲过这种方法:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_30


标签列仍然为object类型:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_31


然后,我们可以将标签列转换为浮点型:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_32


前4列包含不同类型的数据(字符串、?和浮点型数字)。我们删除字符串类型的元素后,才能将各列元素转换为数值型。我们可以用replace函数将所有的?实例(缺失值)替换为NaN :


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_33


现在,我们可以用两种方法处理包含缺失值的行。方法一,用dropna方法直接删除包含缺失值的行:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas dataframe函数_34


方法二,包含缺失数据的行,除了直接将其删除(可能删除重要信息)外,也可为其填充数据。用fillina方法,向这些空的单元格填充一个常量,可满足大多数需求:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_35


经过以上处理,所有列的各元素均为数值型,因此可用astype函数将其设置为float型。此外,我们还可以用lambda函数,将DataFrame的每一列转换为数值类型:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas nan判断_36


上述代码,每个x实例表示一列, to_numeric函数将每一类的元素转换为最相近的数据类型(该例为float ).

pandas教程的最后,我们想演示下如何拼接两个DataFrame对象,因为在真实应用场景,可能会用到这项操作。我们随机选取元素,再创建一个小型的DataFrame :


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_37


上述代码生成一个包括两行数据的新表格。我们可以用concat函数,将其合并到原DataFrame中,将data1的各行拼接到data的下面:


dataframe的最后一行 python dataframe怎么取出一行数据_pandas 删除列_38


执行上述操作后,我们会发现datatot比data增加了两行(注意data的行数与刚开始的不同,因为我们后来删除了它含有NanN元素的行)。