学科分类
目录
数据分析

索引操作

Series类对象属于一维结构,它只有行索引,而DataFrame类对象属于二维结构,它同时拥有行索引和列索引。由于它们的结构有所不同,所以它们的索引操作也会有所不同。接下来,分别为大家介绍Series和DataFrame的相关索引操作,具体内容如下。

(一)Series的索引操作

Series有关索引的用法类似于NumPy数组的索引,只不过Series的索引值不只是整数。如果我们希望获取某个数据,既可以通过索引的位置来获取,也可以使用索引名称来获取,示例代码如下。

In [25]: import pandas as pd
         ser_obj = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
         ser_obj[2]    # 使用索引位置获取数据
Out[25]: 3
In [26]: ser_obj['c']  # 使用索引名称获取数据
Out[26]: 3

当然,Series也可以使用切片来获取数据。不过,如果使用的是位置索引进行切片,则切片结果和list切片类似,即包含起始位置但不包含结束位置;如果使用索引名称进行切片,则切片结果是包含结束位置的,示例代码如下。

In [27]: ser_obj[2: 4]      # 使用位置索引进行切片
Out[27]: 
c  3
d  4
dtype: int64
In [28]: ser_obj['c': 'e']   # 使用索引名称进行切片
Out[28]: 
c  3
d  4
e  5
dtype: int64

如果希望获取的是不连续的数据,则可以通过不连续索引来实现,具体示例代码如下。

In [29]: ser_obj[[0, 2, 4]]        # 通过不连续位置索引获取数据集
Out[29]: 
a  1
c  3
e  5
dtype: int64
In [30]: ser_obj[['a', 'c', 'd']]  # 通过不连续索引名称获取数据集
Out[30]: 
a  1
c  3
d  4
dtype: int64

布尔型索引同样适用于Pandas,具体的用法跟数组的用法一样,将布尔型的数组索引作为模板筛选数据,返回与模板中True位置对应的元素,具体代码如下。

In [31]: ser_bool = ser_obj > 2     # 创建布尔型Series对象
         ser_bool
Out[31]: a  False
         b  False
         c  True
         d  True
         e  True
dtype: bool
In [32]: ser_obj[ser_bool]        # 获取结果为True的数据
Out[32]: 
         c  3
         d  4
         e  5
dtype: int64

(二)DataFrame的索引操作

DataFrame结构既包含行索引,也包含列索引。其中,行索引是通过index属性进行获取的,列索引是通过columns属性进行获取的,索引的结构如图1所示。

img

图1 DataFrame索引示意图

通过图1可以看出,DataFrame中每列的数据都是一个Series对象,我们可以使用列索引进行获取。例如,创建一个3行4列的DataFrame对象,并获取其中的1列数据,具体代码如下。

In [33]: arr = np.arange(12).reshape(3, 4)
         # 创建DataFrame对象,并为其指定列索引
         df_obj = pd.DataFrame(arr, columns=['a', 'b', 'c', 'd'])
         df_obj
Out[33]: 
  a b  c  d
0 0 1  2  3
1 4 5  6  7
2 8 9 10 11
In [34]: df_obj['b']       # 获取b列的数据
Out[34]: 
​    0  11  52  9
Name: b, dtype: int32
In [35]: type(df_obj['b']) 
Out[35]: pandas.core.series.Series

如果要从DataFrame中获取多个不连续的Series对象,则同样可以使用不连续索引进行实现,具体示例代码如下。

In [36]: df_obj[['b', 'd']]    # 获取不连续的Series对象
Out[36]: 
  b  d
0 1  3
1 5  7
2 9 11
In [37]: df_obj[:2]        # 使用切片获取第0~1行的数据
Out[37]: 
  a b c d
0 0 1 2 3
1 4 5 6 7
# 使用多个切片先通过行索引获取第0~2行的数据,再通过不连续列索引获取第b、d列的数据
In [38]: df_obj[: 3][['b', 'd']] 
Out[38]: 
  b  d
0 1  3
1 5  7
2 9 11

多学一招:使用Pandas提供的方法操作索引

虽然DataFrame操作索引能够满足基本数据查看请求,但是仍然不够灵活。为此,Pandas库中提供了操作索引的方法来访问数据,具体包括:

  • loc:基于标签索引(索引名称,如a、b等),用于按标签选取数据。当执行切片操作时,既包含起始索引,也包含结束索引。

  • iloc:基于位置索引(整数索引,从0到length-1),用于按位置选取数据。当执行切片操作时,只包含起始索引,不包含结束索引。

iloc方法主要使用整数来索引数据,而不能使用字符标签来索引数据。而loc方法恰恰相反,它只能使用字符标签来索引数据,而不能使用整数来索引数据。不过,当DataFrame对象的行索引或列索引使用的是整数时,则其就可以使用整数来索引。

假设,现在有一个DataFrame对象,具体代码如下。

In [39]: arr = np.arange(16).reshape(4, 4)
         dataframe_obj = pd.DataFrame(arr, columns=['a', 'b', 'c', 'd'])
         dataframe_obj

Out[39]: 
  a  b  c  d
0  0  1  2  3
1  4  5  6  7
2  8  9 10 11
3 12 13 14 15

接下来,我们通过一段示例程序来演示如何使用上述方法来获取DataFrame中多列的数据,具体代码如下。

In [40]: dataframe_obj.loc[:, ["c", "a"]]
In [41]: dataframe_obj.iloc[:, [2, 0]]

它们两个输出的结果一样,具体如下:

   c  a
0  2  0
1  6  4
2 10  8
3 14 12

还可以通过loc方法和iloc方法使用花式索引来访问数据,具体代码如下。

In [43]: dataframe_obj.loc[1:2, ['b','c']]
In [44]: dataframe_obj.iloc[1:3, [1, 2]]

它们两个输出的结果也是一样的,具体如下:

  b  c
1 5  6
2 9 10
点击此处
隐藏目录