Python 数据处理(二十四)—— 索引和选择

Python016

Python 数据处理(二十四)—— 索引和选择,第1张

如果你想获取 'A' 列的第 0 和第 2 个元素,你可以这样做:

这也可以用 .iloc 获取,通过使用位置索引来选择内容

可以使用 .get_indexer 获取多个索引:

警告 :

对于包含一个或多个缺失标签的列表,使用 .loc 或 [] 将不再重新索引,而是使用 .reindex

在以前的版本中,只要索引列表中存在至少一个有效标签,就可以使用 .loc[list-of-labels]

但是现在,只要索引列表中存在缺失的标签将引发 KeyError 。推荐的替代方法是使用 .reindex() 。

例如

索引列表的标签都存在

先前的版本

但是,现在

索引标签列表中包含不存在的标签,使用 reindex

另外,如果你只想选择有效的键,可以使用下面的方法,同时保留了数据的 dtype

对于 .reindex() ,如果有重复的索引将会引发异常

通常,您可以将所需的标签与当前轴做交集,然后重新索引

但是,如果你的索引结果包含重复标签,还是会引发异常

使用 sample() 方法可以从 Series 或 DataFrame 中随机选择行或列。

该方法默认会对行进行采样,并接受一个特定的行数、列数,或数据子集。

默认情况下, sample 每行最多返回一次,但也可以使用 replace 参数进行替换采样

默认情况下,每一行被选中的概率相等,但是如果你想让每一行有不同的概率,你可以为 sample 函数的 weights 参数设置抽样权值

这些权重可以是一个列表、一个 NumPy 数组或一个 Series ,但它们的长度必须与你要抽样的对象相同。

缺失的值将被视为权重为零,并且不允许使用 inf 值。如果权重之和不等于 1 ,则将所有权重除以权重之和,将其重新归一化。例如

当应用于 DataFrame 时,您可以通过简单地将列名作为字符串传递给 weights 作为采样权重(前提是您要采样的是行而不是列)。

sample 还允许用户使用 axis 参数对列进行抽样。

最后,我们还可以使用 random_state 参数为 sample 的随机数生成器设置一个种子,它将接受一个整数(作为种子)或一个 NumPy RandomState 对象

当为该轴设置一个不存在的键时, .loc/[] 操作可以执行放大

在 Series 的情况下,这实际上是一个追加操作

可以通过 .loc 在任一轴上放大 DataFrame

这就像 DataFrame 的 append 操作

由于用 [] 做索引必须处理很多情况(单标签访问、分片、布尔索引等),所以需要一些开销来搞清楚你的意图

如果你只想访问一个标量值,最快的方法是使用 at 和 iat 方法,这两个方法在所有的数据结构上都实现了

与 loc 类似, at 提供了基于标签的标量查找,而 iat 提供了基于整数的查找,与 iloc 类似

同时,你也可以根据这些索引进行设置值

如果索引标签不存在,会放大数据

另一种常见的操作是使用布尔向量来过滤数据。运算符包括:

|(or) 、 &(and) 、 ~ (not)

这些必须用括号来分组,因为默认情况下, Python 会将 df['A'] >2 &df['B'] <3 这样的表达式评估为 df['A'] >(2 &df['B']) <3 ,而理想的执行顺序是 (df['A'] >2) &(df['B'] <3)

使用一个布尔向量来索引一个 Series ,其工作原理和 NumPy ndarray 一样。

您可以使用一个与 DataFrame 的索引长度相同的布尔向量从 DataFrame 中选择行

列表推导式和 Series 的 map 函数可用于产生更复杂的标准

我们可以使用布尔向量结合其他索引表达式,在多个轴上索引

iloc 支持两种布尔索引。如果索引器是一个布尔值 Series ,就会引发异常。

例如,在下面的例子中, df.iloc[s.values, 1] 是正确的。但是 df.iloc[s,1] 会引发 ValueError 。

本节将介绍使用多级索引(分层索引)和其他高级索引技巧

分层或多级次索引的存在是非常有意义的,因为它打开了复杂的数据分析和操作的大门,特别是处理高维数据

从本质上讲,它允许您在较低维度的数据结构包括 Series(1d) 和 DataFrame(2d) 中存储和操作任意维度的数据

在本节中,我们将展示分层索引的确切含义,以及如何结合前面介绍的所有 pandas 索引功能使用

在 0.24.0 版本之后, MultiIndex.label 重命名为 MultiIndex.codes 。 MultiIndex.set_labels 重命名为 MultiIndex.set_codes .

MultiIndex 对象是标准 Index 对象的分层模式,它通常在 pandas 对象中存储轴标签

你可以把 MultiIndex 看成一个元组数组,其中每个元组都是唯一的。 MultiIndex 有如下创建方式

当传递给 Index 构造函数一个元组列表时,它将尝试返回一个 MultiIndex 。

下面的示例演示了初始化 MultiIndex 的不同方法。

当你想要对两个可迭代对象中的每个元素进行两两配对时,可以使用 MultiIndex.from_product()

您也可以使用 MultiIndex.from_frame() 方法直接从 DataFrame 中构造一个 MultiIndex 。

为了方便起见,你可以直接将数组列表传递给 Series 或 DataFrame 的 index 参数来自动构造一个 MultiIndex

所有的 MultiIndex 构造函数都接受一个 name 参数,该参数存储索引级别的名称。如果没有设置,则值为 None

索引可以放在任何轴上,索引的层级也可以随你设置

这已经简化了较高层次的索引,使控制台的输出更容易看清。

注意 ,索引的显示方式可以通过 pandas.set_options() 中的 multi_sparse 选项来控制。

值得注意的是,将元组用作轴上的原子标签也是可以的

多索引之所以重要,是因为它允许您执行分组、选择和重塑操作,我们将在下面以及后续部分中描述这些操作

get_level_values() 方法能够返回特定级别的标签向量

分级索引的一个重要特性是,您可以通过标识数据中的子组的部分标签来选择数据

部分选择以一种完全类似于在常规 DataFrame 中选择列的方式,返回的结果会 "降低" 分层索引的级别

MultiIndex 会保留索引的所有已经定义了的级别,尽管它们实际上可能并没有被使用。

在对索引进行切片时,您可能会注意到这一点。例如

这样做的目的是为了避免重新计算级别,以提高切片的性能。如果你只想看某一级别,可以使用 get_level_values() 方法

可以使用 remove_unused_levels() 方法重构 MultiIndex

在具有 MultiIndex 的不同索引对象之间的操作会自动对齐

Series/DataFrames 的 reindex() 方法可以传入一个 MultiIndex ,甚至可以是一个元组列表或元组数组

1.什么是索引?

【1】表示引用向量或者矩阵中的一个数

2.什么是向量的索引?

引用向量中具体的某几个数例如:

[1].给出a向量,a=np.arrary(0,1,2,3,4,5,6,7,8,9)

[2].引用a向量中0-8的数并打印出来:print(a[0:9])

[3].把3后面的数都打印出来:print(a[3:])

[4].把3到最后倒数第二个数都打印出来:print(a[3:-1])//注:其中-1表示的是至倒数第一 个 数,但不能用-0,这样则表示无效

[5].把3前面的数全部打印出来:print(a[:3])

2.注意事项:[1].0:9表示的是比9小的数,而不包括9

3.什么是矩阵的索引?

[1].给出矩阵b,在已经给出a向量的前提下,我们对a进行重塑:b=a.reshape(5,2)得到一个五行两列的矩阵按照0123456789的顺序排列下来

[2].如果想取矩阵中的某个元素--按照几行几列的方法例如:print(b[2,3])这里得到的就是2行3列的一个元素

[3].如果想要得到某一行的元素:print(b[3,:])表示取到第4行的元素

[4].如果想要得到某一列的元素:print(b[:,1])表示取到第2列的元素