Pandas 使用教程 3

来源:互联网 发布:粉红女郎 知乎 编辑:程序博客网 时间:2024/06/06 11:05

Pandas 使用教程--Pandas 数据选择与过滤

一、实验介绍

1.1 实验内容

Pandas 是非常著名的开源数据处理工具,我们可以通过它对数据集进行快速读取、转换、过滤、分析等一系列操作。除此之外,Pandas 拥有强大的缺失数据处理与数据透视功能,可谓是数据预处理中的必备利器。这是 Pandas 使用教程的第 3 章节,将学会使用 Pandas 对数据进行选择与变换。

1.2 实验知识点

  • 基于索引数字选择
  • 基于标签名称选择
  • 数据随机取样
  • 条件语句选择
  • where() 方法选择
  • query() 方法选择

1.3 实验环境

  • python2.7
  • Xfce 终端
  • ipython 终端

1.4 适合人群

本课程难度为一般,属于初级级别课程,适合具有 Python 基础,并对使用 Pandas 进行数据处理感兴趣的用户。

1.5 数据文件

学习本课程之前,请先打开在线环境终端,下载本文可能会用到的数据文件。

wget http://labfile.oss.aliyuncs.com/courses/906/los_census.csv

los_census.csv 为为洛杉矶人口普查数据,仅格式有区别。

下面的内容均在 iPython 交互式终端中演示,你可以通过在线环境左下角的应用程序菜单 > 附件打开。如果你在本地进行练习,推荐使用 Jupyter Notebook 环境。

二、数据选择

在数据预处理过程中,我们往往会对数据集进行切分,只将需要的某些行、列,或者数据块保留下来,输出到下一个流程中去。这也就是这里所说的数据选择。

由于 Pandas 的数据结构中存在索引、标签,所以我们可以通过多轴索引完成对数据的选择。

2.1 基于索引数字选择

当我们新建一个 DataFrame 之后,如果未自己指定行索引或者列对应的标签,那么 Pandas 会默认从 0 开始以数字的形式作为行索引,并以数据集的第一行作为列对应的标签。其实,这里的「列」也有数字索引,默认也是从 0 开始,只是未显示出来。

所以,我们首先可以基于数字索引对数据集进行选择。这里用到的 Pandas 中的 .iloc 方法。该方法可以接受的类型有:

  1. 整数。例如:5
  2. 整数构成的列表或数组。例如:[1, 2, 3]
  3. 布尔数组。
  4. 可返回索引值的函数或参数。

下面,我们还是用 los_census.csv 数据集演示该方法的使用。如果未下载该数据集,请看 1.5 节。

import pandas as pddf = pd.read_csv("los_census.csv")print df.head()

此处输入图片的描述

首先,我们可以选择前 3 行数据。这和 python 或者 numpy 里面的切片很相似。

print df.iloc[:3]

此处输入图片的描述

我们还可以选择特定的一行。

print df.iloc[5]

此处输入图片的描述

那么选择多行是不是 print df.iloc[1, 3, 5] 这样呢?答案是错误的。df.iloc[][[行],[列]] 里面可以同时接受行和列的位置,如果你直接键入 df.iloc[1, 3, 5] 就会报错。

所以,很简单。如果你想要选择 1,3,5 行,可以这样做。

print df.iloc[[1, 3, 5]]

此处输入图片的描述

选择行学会以后,选择列就应该能想到怎么办了。你可以先暂停浏览下面的内容,自己试一试。

例如,我们要选择第 2-4 列。

print df.iloc[:, 1:4]

此处输入图片的描述

这里选择 2-4 列,输入的却是 1:4。这和 python 或者 numpy 里面的切片操作非常相似。

既然我们能定位行和列,那么只需要组合起来,我们就可以选择数据集中的任何一块数据了。

2.2 基于标签名称选择

除了根据数字索引选择,我们还可以直接根据标签对应的名称选择。这里用到的方法和上面的 iloc 很相似,少了个 idf.loc[]

df.loc[] 可以接受的类型有:

  1. 单个标签。例如:2'a',这里的 2 指的是标签而不是索引位置。
  2. 列表或数组包含的标签。例如:['A', 'B', 'C']
  3. 切片对象。例如:'A':'E',注意这里和上面切片的不同支持,首位都包含在内。
  4. 布尔数组。
  5. 可返回标签的函数或参数。

下面,我们来演示 df.loc[] 的用法。我们先随机生成一个 DataFrame。

import pandas as pdimport numpy as np  # 加载 numpy 模块df = pd.DataFrame(np.random.randn(6,5),index=list('abcdef'),columns=list('ABCDE'))print df

此处输入图片的描述

先选择前 3 行:

print df.loc['a':'c']

此处输入图片的描述

再选择 1,3,5 行:

print df.loc[['a', 'c', 'd']]

此处输入图片的描述

然后,选择 2-4 列:

print df.loc[:, 'B':'D']

此处输入图片的描述

最后,选择 1,3 行和 C 后面的列:

print df.loc[['a','c'], 'C':]

此处输入图片的描述

2.3 数据随机取样

上面,的 .iloc.loc 可用于精准定位数据块。而 Pandas 同样也提供了随机取样的方法,用于满足各种情况。随机取样用.sample() 完成,下面我们就演示一下它的用法。

首先,看一看 Series 数据结构。

import pandas as pds = pd.Series([0,1,2,3,4,5,6,7,8,9])print s.sample()

此处输入图片的描述

我们可以看到,默认情况下 .sample() 返回了一个数值。注意,前面的 2 是数字索引,后面的 2 才是值。

我们可以通过 n= 参数,设定返回值的数量。

print s.sample(n=5)

此处输入图片的描述

同样也可以用 frac= 参数设定返回数量的比例。

print s.sample(frac=.6) # 返回 60% 的数值

此处输入图片的描述

对应 DataFrame 而言,过程也很相似,只是需要选择坐标轴。举个例子:

import pandas as pdimport numpy as npdf = pd.DataFrame(np.random.randn(6,5),index=list('abcdef'),columns=list('ABCDE'))print dfprint df.sample(n=3)

此处输入图片的描述

默认会返回行,如果要随机返回 3 列。需要添加 axis= 参数。

print df.sample(n=3, axis=1)

此处输入图片的描述

2.4 条件语句选择

数据选择的时候,我们还可以加入一些条件语句,从而达到对数据筛选的目的。这个过程和 numpy 里面的效果很相似。我们先举一个 Series 的例子:

import pandas as pds = pd.Series(range(-5, 5))print sprint s[(s < -2) | (s > 1)] # 添加 逻辑或 条件

此处输入图片的描述

对于 DataFrame 也是相似的。

import pandas as pdimport numpy as npdf = pd.DataFrame(np.random.randn(6,5),index=list('abcdef'),columns=list('ABCDE'))print dfprint df[(df['B'] > 0) | (df['D'] < 0)]  # 添加条件

此处输入图片的描述

2.5 where() 方法选择

接下来,再介绍一种通过 where() 方法进行数据选择得方法。DataFrame 和 Series 都带有 where(),可以通过一些判断句来选择数据。举个例子:

import pandas as pdimport numpy as npdf = pd.DataFrame(np.random.randn(6,5),index=list('abcdef'),columns=list('ABCDE'))print dfprint df.where(df < 0)  # 添加条件

.where(df < 0) 会返回所有负值,而非负值就会被置为空值 NaN。

此处输入图片的描述

你也可以对判断条件以外得值重新替代,例如这里将非负值全部变号为负值。

print df.where(df < 0, -df)  # 筛选负值并将正值变号

此处输入图片的描述

故,where() 实际上期待了匹配和替换得效果。我们可以借助该方法实现对数据的自由设定。

2.6 query() 方法选择

针对数据变换和筛选的方法还很多,除了上面的提到的,Pandas 0.13 之后的版本中增加了 query() 实验性方法,该方法也可以被用来选择数据。

query() 是 DataFrame 具有的方法,你可以通过一个比较语句对满足行列条件的值进行选择,举个例子:

import pandas as pdimport numpy as npdf = pd.DataFrame(np.random.rand(10, 5), columns=list('abcde'))print dfprint df.query('(a < b) & (b < c)')  # 添加 逻辑与 条件

上面的判断语句应该很容易看明白,也就是满足 a 列的值需小于 b 列,且 b 列的值小于 c 列所在的行。

此处输入图片的描述

当然,在没有 query() 之前,我们也是可以通过前面提到的条件语句选择。

print df[(df.a < df.b) & (df.b < df.c)]

此处输入图片的描述

结果虽然一致,但是 query() 语句的确要简洁和自然很多。query() 包含很多内容,非常强大。你可以通过官方文档了解,这里就不再赘述了。

三、实验总结

本章节学习了针对数据选择的常用方法和手段,这是 Pandas 中十分重要的一部分内容。针对数据集的处理,无外乎就是变换、筛选,最终得到我们想要的数据。