一、索引器
1. 表的列索引
列索引是最常见的索引形式,一般通过 [ ] 来实现。通过 [列名] 可以从 DataFrame 中取出相应的列,返回值为 Series。
【例子】从表中取出姓名一列
df['Name'].head()
如果要取出多个列,则可以通过 [列名组成的列表] ,其返回值为一个 DataFrame ,例如从表中取出性别和姓名两列:
df[['Gender', 'Name']].head()
若要取出单列,且列名中不包含空格,则可以用 .列名 取出,这和 [列名] 是等价的。
df.Name.head()
2. 序列的行索引
- 以字符串为索引的 Series
如果取出单个索引的对应元素,则可以使用 [item] ,若 Series 只有单个值对应,则返回这个标量值,如果有多个值对应,则返回一个 Series :s['b']
如果取出多个索引的对应元素,则可以使用 [items的列表] :s[['c', 'b']]
- 以整数为索引的 Series
在使用数据的读入函数时,如果不特别指定所对应的列作为索引,那么会生成从0开始的整数索引作为默认索引。当然,任意一组符合长度要求的整数都可以作为索引。
和字符串一样,如果使用 [int] 或 [int_list] ,则可以取出对应索引 元素 的值
s = pd.Series(['a', 'b', 'c', 'd', 'e', 'f'],
index=[1, 3, 1, 2, 5, 4])
s[1]
s[[2,3]]
3. loc索引器
loc 索引器的一般形式是 loc[*, ] ,其中第一个 * 代表行的选择,第二个 * 代表列的选择,如果省略第二个位置写作 loc[] ,这个 * 是指行的筛选。其中, * 的位置一共有五类合法对象,分别是:单个元素、元素列表、元素切片、布尔列表以及函数。
- 为单个元素
此时,直接取出相应的行或列,如果该元素在索引中重复则结果为 DataFrame,否则为 Series : - 为元素列表
此时,取出列表中所有元素值对应的行或列: - 为切片
之前的 Series 使用字符串索引时提到,如果是唯一值的起点和终点字符,那么就可以使用切片,并且包含两个端点,如果不唯一则报错:
需要注意的是,如果 DataFrame 使用整数索引,其使用整数切片的时候和上面字符串索引的要求一致,都是 元素 切片,包含端点且起点、终点不允许有重复值。 - 为布尔列表
在实际的数据处理中,根据条件来筛选行是极其常见的,此处传入 loc 的布尔列表与 DataFrame 长度相同,且列表为 True 的位置所对应的行会被选中, False 则会被剔除。 - 为函数
这里的函数,必须以前面的四种合法形式之一为返回值,并且函数的输入值为 DataFrame 本身。
多级索引
多级索引(也称层次化索引)是pandas的重要功能,可以在Series、DataFrame对象上拥有2个以及2个以上的索引。
实质上,单级索引对应Index对象,多级索引对应MultiIndex对象。
- 多级索引Series对象的创建
se1=pd.Series(np.random.randn(4),index=[list("aabb"),[1,2,1,2]])
se1
a 1 0.945676
2 1.240454
b 1 1.021960
2 0.363063
dtype: float64
- 子集的选取
se1['a']
1 0.945676
2 1.240454
dtype: float64
- DataFrame对象的多级索引
创建:
df1=pd.DataFrame(np.arange(12).reshape(4,3),index=[list("AABB"),[1,2,1,2]],columns=[list("XXY"),[10,11,10]])
df1
索引运算
-
.loc()
.loc()主要基于标签(label)的,包括行标签(index)和列标签(colums),即行名称和列名称,可以使用def.loc[index_name, col_name]选择指定位置的数据,主要用法有:
单个标量标签,如果.loc中只有单个标签,那么选择的是一行。如:df.loc['a']选择的是 index 为’a’的一样。
标签列表,如:df.loc[['a', 'b', 'c']],同样只选择行。
切片对象,与通常的 python 切片不同,在最终选择的数据数据中包含切片的 start 和 stop。如:df.loc['c' : 'h'] 即包含’c’行,也包含’h’行。
布尔数组,用于筛选符合某些条件的行,如:df.loc[df.A>0.5] 筛选出所有’A’列大于0.5的行。 -
.iloc()
.iloc() 是基于整数的索引,利用元素在各个轴上的索引序号进行选择,序号超过范围产生IndexError,切片时允许序号超过范围。
各种访问方式如下 –
整数,与.loc相同,如果只使用一个维度,则对行选择,小标从 0 开始。如:df.iloc[5],选择第 6 行。
整数列表或者数组,如df.iloc[[5, 1, 7]],选择第 6 行, 第 2 行, 第 8 行。
元素为整数的切片操作,与.loc不同,这里下标为 stop 的数据不被选择。如:df.iloc[0:3], 只包含 0,1,2行,不包含第 3 行。
使用布尔数组进行筛选,如 df.iloc[np.array(df.A>0.5)],df.iloc[list(df.A>0.5)]。
注意使用布尔数组进行筛选时,可以使用 list 或者 array,使用 Series会出错,NotImplementedError 和 ValueError,前者是 Series 的 index 与待切片 DataFrame的index 不同时报错,后置 index 相同时报错。
与.loc使用布尔数组,可以使用 list, array, 也可以使用Series,使用Series时 index需要一致,否则会报 IndexError。